繁体   English   中英

合并两个不同的数据框

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM