我有一个Pandas数据框架,看起来像这样:
ID Dyn
0 AA01 0.084, 0.049, 0.016, -0.003, 0, 0.025, 0.954, 1
1 BG54 0.216, 0.201, 0.174, 0.175, 0.179, 0.191, 0.200
我正在寻找一种方法来跳过Dyn列,生成另一个只求和大于截止值的数字,即:0.150,分配传递它的值为1的所有值。这是预期的结果:
ID Dyn Sum
0 AA01 0.084, 0.049, 0.016, -0.003, 0, 0.025, 0.954, 1 2
1 BG54 0.216, 0.201, 0.174, 0.175, 0.179, 0.191, 0.200 7
我想我可以使用apply,同时跳过所有行:
for index, rows in df.iterrows():
df['Sum'] = df['Dyn'].apply(lambda x: x = 1 if int(x) > 0.150 )
但是我迷失了如何将条件(仅在大于0.150时求和)应用于'Dyn'内的所有值以及如何将1的值分配给它们。所有的建议都被接受。谢谢!
#Create temp column to hold Dyn convereted into list
df=df.assign(sum=df['Dyn'].str.split(','))
#Explode DataFrame
df=df.explode('sum')
#Convert to float
df['sum']=df['sum'].astype(float)
#Filter out values greater that 0.015, groupby and sum
df[df['sum'].gt(0.150)].groupby(['ID','Dyn'])['sum'].sum().reset_index()
下面这些呢?您可以过滤掉不满足该条件的记录,然后求和:
>>> x = pd.DataFrame({'ID': {0: 'A', 1: 'B'}, 'Dyn': {0: '1,2,3', 1: '2,3,4'}})
>>> x
ID Dyn
0 A 1,2,3
1 B 2,3,4
>>> y = x.set_index('ID').Dyn.str.split(',').explode().astype(int)
>>> y = y[y>=1.5]
>>> x.merge(y.groupby('ID').sum().reset_index().rename({'Dyn':'Sum'}, axis = 1))
ID Dyn Sum
0 A 1,2,3 5
1 B 2,3,4 9