【问题标题】:Pandas: Add columns to DataFrame based off existing columnPandas:根据现有列向 DataFrame 添加列
【发布时间】:2018-08-13 18:25:26
【问题描述】:

我有 2 个正在 Python 中操作的 pandas DataFrame,我想根据某个列 (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  

我不确定如何使用“最佳做法”来解决此问题。

谢谢。

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案1】:

    假设你有:

    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}})
    

    你可以使用合并:

    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 作为 int(感谢 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
    

    【讨论】:

    • downcast 参数可以解决问题...pd.merge(df1,df2,on='col_1',how='left').fillna(0, downcast='infer')
    • pd.merge(df1,df2,on='col_1',how='left').fillna(0).astype(dict(col_3=int))
    【解决方案2】:

    你可以在使用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
    

    【讨论】:

      【解决方案3】:

      如果通常对单个列有效,则映射系列。

      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
      

      【讨论】:

      • 请注意,这是可行的,因为 df1col_1 的唯一值是 df2.col_2 中的一组超级值
      【解决方案4】:

      也许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
      

      【讨论】:

        猜你喜欢
        • 2020-11-07
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-04
        • 1970-01-01
        相关资源
        最近更新 更多