我有一个数据框如下:
Index X_1 X_2 X_3 W_1 W_2 W_3
1 IEZ XOP ABC 0.42 0.18 0.40
2 PXJ ABC XES 0.47 0.12 0.41
3 ABC RYE PXE 0.23 0.33 0.44
4 XOP IEZ ABC 0.62 0.20 0.18
我想通过列X_1到X_3之间的每个“ABC”实例的每个索引行。对于每个实例,我想从列W_1到W_3中提取相应的值并将其附加到新列W.
例如,对于索引行1,如果ABC的实例出现在X_3中,它将从W_3中提取相应的值。
最终产品应如下所示。
Index X_1 X_2 X_3 W_1 W_2 W_3 W
1 IEZ XOP ABC 0.42 0.18 0.40 0.40
2 PXJ ABC XES 0.47 0.12 0.41 0.12
3 ABC RYE PXE 0.23 0.33 0.44 0.23
4 XOP IEZ ABC 0.62 0.20 0.18 0.18
我怎么能只导入numpy和pandas模块呢?
本问题及下方已被采纳的回答均来自云栖社区【Python技术进阶大群】。https://yq.aliyun.com/articles/690084 点击链接欢迎加入社区大社群。
df = pd.DataFrame({'X_1' : ['IEZ', 'PXJ', 'ABC', 'XOP'],
'X_2' : ['XOP', 'ABC', 'RYE', 'IEZ'],
'X_3' : ['ABC', 'XES','PXE', 'ABC'],
'W_1' : [0.42, 0.47, 0.23, 0.62],
'W_2' : [0.18, 0.12, 0.33, 0.20],
'W_3' : [0.40, 0.41, 0.44, 0.18]})
首先,取数字列:
num_columns = df.loc[:,'W_1':'W_3']
接下来,使用X_1- > X_3columns 生成布尔掩码:
df_mask = (df.loc[:,'X_1':'X_3']=='ABC').values
最后,使用DataFrame掩码方法,该方法将在单元格为True时返回NaN,并在掩码为False时返回单元格值。然后,我们将对结果行求和,并将其分配给原始DataFrame:
df['W'] = num_columns.mask(~df_mask).sum(axis=1)
当然,这可以组合成一行:
df['W'] = (df.loc[:,'W_1':'W_3']
.mask(~(df.loc[:,'X_1':'X_3']=='ABC').values)
.sum(axis=1))
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。