Pandas关于dataframe合并的问题记录

/ 默认分类 / 0 条评论 / 78浏览

pandas中怎样合并两个dataframe

import pandas as pd

# 创建两个示例 DataFrame
df1 = pd.DataFrame({'test33': [33], 'test44': [44]}, index=[5])
df2 = pd.DataFrame({'test11': [11], 'test22': [22]}, index=[10])

# 合并 DataFrame 时重新生成索引
df_merged = pd.concat([df1, df2], axis=1, ignore_index=True)

print(df_merged)

==>

    0   1   2   3
0  33  44  11  22

concat函数中的一些参数说明:

沿着哪个轴进行合并。0表示沿着行方向(纵向合并),也就是增加行数,1表示沿着列方向(横向合并),也就是类似于给数据表增加字段。

示例:

result = pd.concat([df1, df2], axis=1)
print(result)

ignore_index: bool = False

是否忽略原始索引。如果为 True,会重新生成索引。dataframe中的索引也就是行标签或者叫做字段名,pandas 的索引用于标识和访问 DataFrame 中的行和列,类似于数据库中的主键或列名。

示例:

python
复制代码
result = pd.concat([df1, df2], ignore_index=True)
print(result)

生成新的dataframe时候,赋值默认值,如果字段值不存在

使用 DataFrame 的 reindex 方法,它会在列名不存在时填充缺失的列并设置默认值(通常为 NaN)。以下是如何修改代码以确保 need_feature_frame 包含所有指定的列,即使其中一些列在 origin_feature_frame 中不存在:

import pandas as pd

# 假设 origin_feature_frame 是已经存在的 DataFrame
origin_feature_frame = pd.DataFrame({
    'test1': [1, 2, 3],
    'test2': [4, 5, 6]
})

model_feature_need_name = ["test1", "test666"]

# 使用 reindex 方法,缺失的列会填充 NaN
need_feature_frame = origin_feature_frame.reindex(columns=model_feature_need_name).copy()

print(need_feature_frame)
  1. origin_feature_frame: 示例原始 DataFrame。
  2. model_feature_need_name: 需要的列名列表,包括 test1 和 test666。
  3. reindex** 方法**: 使用 reindex 方法重新索引列,如果某列不存在,会用 NaN 填充。

==>

   test1  test666
0      1      NaN
1      2      NaN
2      3      NaN

另外,可以使用 fillna 方法来自定义填充默认值为 -1,而不是 NaN。在重新索引之后,你可以直接对结果 DataFrame 进行填充操作。以下是修改后的代码:

import pandas as pd

# 假设 origin_feature_frame 是已经存在的 DataFrame
origin_feature_frame = pd.DataFrame({
    'test1': [1, 2, 3],
    'test2': [4, 5, 6]
})

model_feature_need_name = ["test1", "test666"]

# 使用 reindex 方法,缺失的列会填充 NaN
need_feature_frame = origin_feature_frame.reindex(columns=model_feature_need_name).fillna(-1).copy()

print(need_feature_frame)
  1. origin_feature_frame: 示例原始 DataFrame。
  2. model_feature_need_name: 需要的列名列表,包括 test1 和 test666。
  3. reindex** 方法**: 使用 reindex 方法重新索引列,如果某列不存在,会用 NaN 填充。
  4. fillna 方法: 使用 fillna(-1) 将所有 NaN 值填充为 -1。

==>

   test1  test666
0      1       -1
1      2       -1
2      3       -1

如果合并的dataframe中存在重复的字段

如果合并的dataframe中存在重复的字段,那么直接concat之后会出现字段重复,也就是说,frame3中会有两个test22的字段

import pandas as pd

test1 = {"test11":11,"test22":"22"}
test2 = {"test33":33,"test44":"44","test22":"55"}
frame1 = pd.DataFrame([test1])
frame2 = pd.DataFrame([test2])
frame3 = pd.concat([frame1, frame2], axis=1, ignore_index=True)
print(frame3.to_json())

dataframe中的update是来更新dataframe中的字段值,所以无法实现合并,也就是说如果这里使用update:

test1 = {"test11":11,"test22":"22"}
test2 = {"test33":33,"test44":"44","test22":"55"}
frame1 = pd.DataFrame([test1])
frame2 = pd.DataFrame([test2])
frame1.update(frame2)

那么得到的frame1仍然只是test11和test22字段,并且test22字段的值是55.但是没有test33和test44字段。

所以这里可以先寻找到两个dataframe中重复的索引列名,然后在处理:

# 创建示例 DataFrame
test1 = {"test11": 11, "test22": "22"}
test2 = {"test33": 33, "test44": "44", "test22": "55"}

frame1 = pd.DataFrame([test1])
frame2 = pd.DataFrame([test2])

# 找出重复的字段
common_columns = frame1.columns.intersection(frame2.columns)
# 更新 frame1 中的重复字段的值为 frame2 中的值
for col in common_columns:
    frame1[col] = frame2[col]
# 从 frame2 中移除重复的字段
frame2 = frame2.drop(columns=common_columns)
# 合并 DataFrame
result_frame = pd.concat([frame1, frame2], axis=1, ignore_index=False)
print(result_frame)

这样得到的就是

   test11 test22  test33 test44
0      11     55      33     44