Pandas:根据现有列添加列到DataFrame

4

我有两个pandas数据框,正在使用Python进行操作,我想基于某一列(col_1)将它们合并:

#df1
    col_1   col_2          
0       3       7            
1       4       8            
2       5       5    

#df2
  col_1    col_3 
0     4       78
1     5       89

输出应该像这样:
    col_1   col_2   col_3
0   3       7       0
1   4       8       78
2   5       5       89  

我不确定如何使用“最佳实践”来解决这个问题。

谢谢。

4个回答

4
假设您有以下内容:
df1=pd.DataFrame({'col_1': {0: 3, 1: 4, 2: 5}, 'col_2': {0: 7, 1: 8, 2: 5}})
df2=pd.DataFrame({'col_1': {0: 4, 1: 5}, 'col_3': {0: 78, 1: 89}})

您可以使用合并(merge)方法:
pd.merge(df1,df2,on='col_1',how='left').fillna(0)
Out[22]: 
   col_1  col_2  col_3
0      3      7    0.0
1      4      8   78.0
2      5      5   89.0

如果您需要将col_3转换为整数(感谢piRSquared的建议):
pd.merge(df1,df2,on='col_1',how='left').fillna(0, downcast='infer')

Out[25]: 
   col_1  col_2  col_3
0      3      7      0
1      4      8     78
2      5      5     89

1
downcast parameter will do the trick... pd.merge(df1,df2,on='col_1',how='left').fillna(0, downcast='infer') - piRSquared
1
或者 pd.merge(df1, df2, on='col_1', how='left').fillna(0).astype(dict(col_3=int)) - piRSquared

4
您可以在使用 set_index 后使用 join
df1.join(df2.set_index('col_1'), on='col_1').fillna(0, downcast='infer')

   col_1  col_2  col_3
0      3      7      0
1      4      8     78
2      5      5     89

2

将一系列映射到单个列通常是高效的。

df1 = pd.DataFrame({'col_1': [3, 4, 5],
                    'col_2': [7, 8, 5]})

df2 = pd.DataFrame({'col_1': [4, 5],
                    'col_3': [78, 89]})

df1['col_3'] = df1['col_1'].map(df2.set_index('col_1')['col_3']).fillna(0)

#    col_1  col_2  col_3
# 0      3      7    0.0
# 1      4      8   78.0
# 2      5      5   89.0

1
请注意,这是有效的,因为df1col_1的唯一值是df2.col_2中值的超集。 - piRSquared

2
也许可以使用 combine_first 方法。
df1.set_index('col_1').combine_first(df2.set_index('col_1')).fillna(0).reset_index().astype(int)
Out[237]: 
   col_1  col_2  col_3
0      3      7      0
1      4      8     78
2      5      5     89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接