我有三个数据帧:
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']
答案 0 :(得分:1)
首先按boolean indexing
isin
进行过滤,然后按groupby
进行过滤,然后按unstack
重新整合sum
。
df1
和scale
join
到df
的上次过滤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