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)
- origin_feature_frame: 示例原始 DataFrame。
- model_feature_need_name: 需要的列名列表,包括 test1 和 test666。
- 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)
- origin_feature_frame: 示例原始 DataFrame。
- model_feature_need_name: 需要的列名列表,包括 test1 和 test666。
- reindex** 方法**: 使用 reindex 方法重新索引列,如果某列不存在,会用 NaN 填充。
- 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
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为:
2024/10/01 21:22