[英]Merging two different dataframes
我在根据列名合并两个不同的数据框时遇到问题。
代码:
import os, json, xlsxwriter
import pandas as pd
left = pd.DataFrame({'CompID': ['Computer-8', 'Computer-D', 'Computer-4', 'Computer-Z'], 'WindowsOsVersion': ['7', '11', 'XP', ''],'MacOsVersion': ['', '', '', 'Zebra']})
print ("left df:")
print (left)
right = pd.DataFrame({'OsName': ['XP', '7', '11', 'Zebra'], 'Upgrade': ['7', '8', 'none', 'Lion']})
print ("right df:")
print (right)
new_df = pd.merge(left, right, how='inner', left_on=['WindowsOsVersion'], right_on = ['OsName'])
new_df2 = pd.merge(left, right, how='inner', left_on=['MacOsVersion'], right_on = ['OsName'])
print ("WindowsOsVersion df:")
print (new_df)
print ("MacOsVersion df:")
print (new_df2)
tester = pd.merge(new_df, new_df2, on="CompID")
print ("Merge: ")
print (tester)
#print ("new df: ",left.merge(right, left_on=['WindowsOsVersion','MacOsVersion'], right_on='OsName'))
当前结果:
左DF:
CompId | Windows操作系统版本 | MacOS版本 |
---|---|---|
电脑8 | 7 | |
计算机D | 11 | |
电脑-4 | 经验值 | |
电脑-Z | 斑马 |
右 df:
操作系统名称 | 升级 | 成本 |
---|---|---|
经验值 | 7 | £5 |
7 | 8个 | 10英镑 |
11 | 没有任何 | £0 |
斑马 | 狮子 | 10英镑 |
我想要的结果:
CompId | Windows操作系统版本 | MacOS版本 | 操作系统名称 | 升级 | 成本 |
---|---|---|---|---|---|
电脑8 | 7 | 7 | 8个 | 10英镑 | |
计算机D | 11 | 11 | 没有任何 | £0 | |
电脑-4 | 经验值 | 经验值 | 7 | £5 | |
电脑-Z | 斑马 | 斑马 | 狮子 | 10英镑 |
任何帮助,将不胜感激
更新代码:
import os, json, xlsxwriter
import pandas as pd
left = pd.DataFrame({'CompID': ['Computer-8', 'Computer-D', 'Computer-4', 'Computer-Z'], 'WindowsOsVersion': ['7', '11', 'XP', ''],'MacOsVersion': ['', '', '', 'Zebra']})
print ("left df:")
print (left)
right = pd.DataFrame({'OsName': ['XP', '7', '11', 'Zebra'], 'Upgrade': ['7', '8', 'none', 'Lion']})
print ("right df:")
print (right)
new_df = pd.merge(left, right, how='left', left_on=['WindowsOsVersion'], right_on = ['OsName'])
new_df2 = pd.merge(left, right, how='left', left_on=['MacOsVersion'], right_on = ['OsName'])
print ("WindowsOsVersion df:")
print (new_df)
print ("MacOsVersion df:")
print (new_df2)
tester = pd.merge(new_df, new_df2, on="CompID", how='outer',suffixes=('', '_y'))
for col in tester:
if col.endswith('_x'):
tester.rename(columns = lambda col:col.rstrip('_x'),inplace=True)
elif col.endswith('_y'):
to_drop = [col for col in tester if col.endswith('_y')]
tester.drop(to_drop,axis=1,inplace=True)
else:
pass
print ("Merge: ")
print (tester)
#print ("new df: ",left.merge(right, left_on=['WindowsOsVersion','MacOsVersion'], right_on='OsName'))
当前表:
CompId | Windows操作系统版本 | MacOS版本 | 操作系统名称 | 升级 |
---|---|---|---|---|
电脑8 | 7 | 7 | 8个 | |
计算机D | 11 | 11 | 没有任何 | |
电脑-4 | 经验值 | 经验值 | 7 | |
电脑-Z | 斑马 | 钠 | 钠 |
我不确定为什么最后一列没有显示正确的信息?
应该是斑马,狮子
以简单的方式,您可以执行以下操作:
首先创建合并的数据框。
new_df = pd.merge(left, right, how='left', left_on=['WindowsOsVersion'], right_on = ['OsName'])
new_df = pd.merge(new_df, right, how='left', left_on=['MacOsVersion'], right_on = ['OsName'])
此时的 dataframe 看起来像这样:
CompID WindowsOsVersion MacOsVersion OsName_x Upgrade_x OsName_y Upgrade_y
0 Computer-8 7 7 8 NaN NaN
1 Computer-D 11 11 none NaN NaN
2 Computer-4 XP XP 7 NaN NaN
3 Computer-Z Zebra NaN NaN Zebra Lion
现在您可以使用fillna()来组合列数据。 这也可以通过combine_first()来实现
new_df['OsName_x'].fillna(new_df['OsName_y'], inplace = True)
new_df['Upgrade_x'].fillna(new_df['Upgrade_y'], inplace = True)
结果 dataframe 现在看起来像这样:
CompID WindowsOsVersion MacOsVersion OsName_x Upgrade_x OsName_y Upgrade_y
0 Computer-8 7 7 8 NaN NaN
1 Computer-D 11 11 none NaN NaN
2 Computer-4 XP XP 7 NaN NaN
3 Computer-Z Zebra Zebra Lion Zebra Lion
您现在可以像在现有代码中所做的那样删除和重命名列。
您的代码未产生预期结果的原因有两个。 在创建“tester”dataframe 时,指定的后缀是“”和“_y”,而不是“_x”和“_y”。 然后后续代码尝试重命名后缀为“_x”的列(没有列)。 并删除后缀为“_y”的那些(最后 4 列): 在重命名和删除操作之前,dataframe“tester”如下所示:
CompID WindowsOsVersion MacOsVersion OsName Upgrade WindowsOsVersion_y MacOsVersion_y OsName_y Upgrade_y
0 Computer-8 7 7 8 7 NaN NaN
1 Computer-D 11 11 none 11 NaN NaN
2 Computer-4 XP XP 7 XP NaN NaN
3 Computer-Z Zebra NaN NaN Zebra Zebra Lion
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.