根据列条件添加具有来自另一个数据框的值的列

时间:2020-04-22 20:52:16

标签: python pandas dataframe

我有两个索引长度不同的数据帧,如下所示:

df_1:

    State  Month  Total Time ... N columns
     AL     4       1000
     AL     5       500
      .
      .
      .
     VA     11      750
     VA     12      1500 

df_2:

    State   Month ... N columns
     AL      4        
     AL      5
      .
      .
      .
     VA      11
     VA      12

如果状态和月份值在数据帧之间相同,我想向df_2添加一个Total time列,该列使用df_1的Total Time列中的值。最终,我将得到:

df_2:

    State  Month  Total Time ... N columns
     AL     4       1000
     AL     5       500
      .
      .
      .
     VA     11      750
     VA     12      1500 

我希望有条件地执行此操作,因为索引长度不同。到目前为止,我已经尝试过:

def f(row):
     if (row['State'] == row['State']) & (row['Month'] == row['Month']):
         val = x for x in df_1["Total Time"]
     return val

df_2['Total Time'] = df_2.apply(f, axis=1)

这不起作用。您将使用哪种方法来完成此任务? 任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

您可以这样做:

考虑我的示例数据框:

In [2327]: df_1                                                                                                                                                                                              
Out[2327]: 
  State  Month  Total Time
0    AL      2        1000
1    AB      4         500
2    BC      1         600

In [2328]: df_2                                                                                                                                                                                              
Out[2328]: 
  State  Month
0    AL      2
1    AB      5

In [2329]: df_2 = pd.merge(df_2, df_1, on=['State', 'Month'], how='left')                                                                                                                                      

In [2330]: df_2                                                                                                                                                                                              
Out[2330]: 
  State  Month  Total Time
0    AL      2      1000.0
1    AB      5         NaN

答案 1 :(得分:0)

如其他评论所述,pd.merge()是连接两个数据框并提取列的方式。问题在于,仅将“状态”和“月”合并将导致每个排列成为新列(df_1中的所有Al-4将与df_2中的所有其他AL-4合并)。

以您的示例为例,

df_1
  State  Month  Total Time  df_1 col...
0    AL      4        1000            6
1    AL      4         500            7
2    VA     12         750            8
3    VA     12        1500            9

df_2
  State  Month  df_2 col...
0    AL      4            1
1    AL      4            2
2    VA     12            3
3    VA     12            4


df_1_cols_to_use = ['State', 'Month', 'Total Time']
# note the selection of the column to use from df_1. We only want the column
# we're merging on, plus the column(s) we want to bring in, in this case 'Total Time'
new_df = pd.merge(df_2, df_1[df_1_cols_to_use], on=['State', 'Month'], how='left')

new_df:
  State  Month  df_2 col...  Total Time
0    AL      4            1        1000
1    AL      4            1         500
2    AL      4            2        1000
3    AL      4            2         500
4    VA     12            3         750
5    VA     12            3        1500
6    VA     12            4         750
7    VA     12            4        1500

您提到它们的索引长度不同。根据问题的参数,无法确定Total Time的哪个值将与df_2中的一行匹配。如果df_2中有3个AL-4条目,它们分别得到1000、500或某种组合吗?该信息将是必需的。没有这个,这将是获得所有可能性的最佳猜测。