【发布时间】:2019-06-17 12:05:11
【问题描述】:
import numpy as np
import pandas as pd
df1 = pd.DataFrame({"id": ["s1", "s2", "s3"],"threshold": [1, 2, 7]})
df2 = pd.DataFrame({"id": ["s1", "s1", "s1", "s2", "s2", "s3", "s3", "s3", "s5", "s5"], "value": [2, -1, 1, -3, 3, 3, 4, 2, 1, 6]})
我想在我的数据框 df1 中添加一列,这样:
- df1["newcolumn"]是,df2中"value"的"sum",
- 对于df1中的相应id,
- 其中 df2 中的“值”大于或等于 df1 中定义的“阈值”
- 对于每个相应的 ID。
例如
- 对于 df1 中的 id="s1",
- df2 中有三个“值”(即 2、-1 和 1),
- 在 df2 中的这些“值”中,只有 2 和 1 大于或等于 df1 中为 s1 定义的“阈值”(即 1)
- 所以,代码应该为 s1 返回 2+1 = 3,
- 以类似的方式,它应该为 s2 返回 3,
- 以类似的方式,它应该为 s3 返回 0,
- 以类似的方式,它应该返回,大概是 s5 的 NaN
我知道我也可以通过循环处理这个计算。
即
df1['my_stat_column'] = 0 # initialize
for i in range(0, df1.shape[0]):
s = df1.iloc[i]['id']
t = df1.iloc[i]['threshold']
for v in range(0, df2.shape[0]):
non_pythonic_and_stupid_way = df2[ (df2['id']==s) & (df2['value']>=t)]
my_stat_value = non_pythonic_and_stupid_way['value'].sum()
df1.iloc[i]['my_stat_column'] = my_stat
df1.head()
那么,通过另一个数据帧的列过滤一个 Pandas 数据帧的真正方法是什么?
谢谢!
【问题讨论】:
-
在示例中,您的值是有意为之的字符串?
-
我编辑了这个错误。感谢您指出这一点。