开发者社区> 问答> 正文

在数据框中查找值并在相应列中交叉引用值

我有一个数据框如下:

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 点击链接欢迎加入社区大社群。

展开
收起
一码平川MACHEL 2019-02-28 14:34:54 4242 0
1 条回答
写回答
取消 提交回答
  • 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))
    2019-07-17 23:29:47
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载