在比较pandas中的多个数据帧时,在数据框中创建一个列

时间:2017-07-03 12:10:48

标签: python pandas

我有三个数据帧:

          df1                  df2                    df3
   scale   year   week         n_u         Code   H_k   year   week    n_u
0   -23    2016    20          131        002.55   1    2016    20     132
1   -22    2016    21          132        002.55   1    2016    23     132
2   -21    2016    22          ...        002.44   2    2016    22     131
                                          002.32   1    2016    20     131
                                          002.55   1    2016    22     131
                                          002.55   1    2016    24     132
                                          002.55   1    2016    21     132
                                          002.55   1    2016    21     131
                                          002.55   1    2016    24     131
                                          002.55   2    2016    21     131
                                          002.55   3    2016    22     132
                                          002.55   1    2016    22     132
...                                         ...

我还有一个变量c1 = 002.55。每次我设置此变量的值。

我需要做以下事情:

如果列中的值为" Code"则选择df3中的所有行。等于c1。

然后从df2中找到n_u列中的所有值(此列中的值可以不同)。对于每个唯一值,我需要在df1中创建一个列。

并计算df1中每行的H_k中df3中的值的总和。我需要在数据框df1和df3中按年和周进行比较(年和周可以不同)。

结果应如下所示:

                  df1                 
   scale   year   week   131   132
0   -23    2016    20     1     1
1   -22    2016    21     3     1
2   -21    2016    22     1     4      
...

我希望这个例子可以更好地理解。

所有这一切都在列#34; scale"中的值之前完成。不等于零。

我以为我可以使用lambda。但我不知道如何写这样的条件。

UPD我会尝试更好地描述算法:

选择df3 df3['Code'] = c1

中的所有行

scale!= 0:

df2['n_u']中的每个唯一值创建df1中的新列(通常是否可以实现?)

df1['each unique value from df2'] = sum values from df3['H_k'] on condition df1['year'] = df3['year'] df1['week'] = df3['week']

1 个答案:

答案 0 :(得分:1)

首先按boolean indexing isin进行过滤,然后按groupby进行过滤,然后按unstack重新整合sum

df1scale joindf的上次过滤df1

c1 = '002.55'
df = df3[(df3['Code'] == c1) & (df3['n_u'].isin(df2['n_u']))]
df = df.groupby(['year','week', 'n_u'])['H_k'].sum().unstack(fill_value=0)
print (df)
n_u        131  132
year week          
2016 20      0    1
     21      3    1
     22      1    4
     23      0    1
     24      1    1

df = df1[df1['scale'] < 0].join(df, on=['year','week'])
print (df)
   scale  year  week  131  132
0    -23  2016    20    0    1
1    -22  2016    21    3    1
2    -21  2016    22    1    4