我有一个熊猫数据框和以下三个列表。
list1 = ['n3', 'n5', 'n7']
list2 = ['n1', 'n2', 'n4', 'n11', 'n12']
list3 = ['n6', 'n8', 'n9', 'n10']
item n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 n11 n12
item1 1 6 7 8 9 1 6 8 8 9 9 5
item2 1 6 7 6 9 1 8 8 8 9 9 5
我想在三个列表中选择列名,并执行以下算术函数。
abs(n)
)和加法运算符1/n
)和加法例如,如果我们采用item1
:
add columns n3, n5, n7
,即7+9+6 = 22
take abosulte and add columns n1, n2, n4, n11, n12
,即abs(1)+abs(6)+abs(8)+abs(9)+abs(5) = 29
take inverse and add columns n6, n8, n9, n10
即1/1 + 1/8 + 1/8 + 1/9 = 1.3611
现在,我想分别将总和加到数据框中。
item n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 n11 n12 list1_sum list2_sum list3_sum total_sum
item1 1 6 7 8 9 1 6 8 8 9 9 5 xxx xxx xxx xxx
item2 1 6 7 6 9 1 8 8 8 9 9 5 xxx xxx xxx xxx
我能够按照以下步骤进行list1
。
df['list1_sum'] = df[list1].sum(axis=1)
但是,我找不到如何执行剩余操作的方法。
很高兴在需要时提供更多详细信息。
答案 0 :(得分:2)
使用DataFrame.abs
和DataFrame.rdiv
从右侧分开:
df['list1_sum'] = df[list1].sum(axis=1)
df['list2_sum'] = df[list2].abs().sum(axis=1)
df['list3_sum'] = df[list3].rdiv(1).sum(axis=1)
#same like
#df['list3_sum'] = (1 / df[list3]).sum(axis=1)
df['total_sum'] = df[['list1_sum','list2_sum','list3_sum']].sum(axis=1)
print (df)
item n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 n11 n12 list1_sum \
0 item1 1 6 7 8 9 1 6 8 8 9 9 5 22
1 item2 1 6 7 6 9 1 8 8 8 9 9 5 24
list2_sum list3_sum total_sum
0 29 1.361111 52.361111
1 27 1.361111 52.361111
答案 1 :(得分:1)
您也可以尝试以下方法:
df[list2].apply(lambda x: 1/x.sum(), axis=1)
df[list2].apply(lambda x: 1.0/x.sum(), axis=1)
但是,jezrael的回答更快