猿问

根据行相关和列相关条件设置数据框值

情况

考虑一个df包含以下列的数据框:

  • 一列名为amount. 此列中的所有值要么是大于 0 的整数,要么是 NaN。

  • 名为property_1property_2、 等的多个列property_3。这些列中的值是任意的。

一个简单的例子df是:

import numpy as np

import pandas as pd


data = [

    [2, 7., 2., 4., 3.],

    [np.nan, 8., 3., 4., 2.],

    [3, 9., 1., 5., 6.],

    [1, 8., 2., 4., 1.],

]

columns = ['amount', 'property_1', 'property_2', 'property_3', 'property_4']

df = pd.DataFrame(data, columns=columns)

在控制台输出中如下所示:


   amount  property_1  property_2  property_3  property_4

0     2.0         7.0         2.0         4.0         3.0

1     NaN         8.0         3.0         4.0         2.0

2     3.0         9.0         1.0         5.0         6.0

3     1.0         8.0         2.0         4.0         1.0

问题

我想转换df成一个如下所示的数据框:


   amount  property_1  property_2  property_3  property_4

0     2.0         7.0         2.0         NaN         NaN

1     NaN         NaN         NaN         NaN         NaN

2     3.0         9.0         1.0         5.0         NaN

3     1.0         8.0         NaN         NaN         NaN

基本上我想在列名的数字后缀大于amount值或amount值为 NaN 的所有位置设置一个 NaN 值。


我觉得必须有一种聪明的方法来通过一些矢量化数据帧操作来实现这一点。有人知道具体如何吗?


扬帆大鱼
浏览 162回答 1
1回答

慕勒3428872

您可以使用 为您的第一个条件构造布尔掩码np.subtract.outer。fillna(0)由于所有正整数都大于 0,因此通过处理第二个空条件。# extract integers from columnsints = df.columns[1:].str.rsplit('_', n=1).str[-1].astype(int)# perform elementwise comparison after replacing null amounts with 0bool_arr = np.subtract.outer(ints, df['amount'].fillna(0)).T# apply Boolean mask to selected columnsdf.iloc[:, 1:] = df.iloc[:, 1:].mask(bool_arr > 0)print(df)   amount  property_1  property_2  property_3  property_40     2.0         7.0         2.0         NaN         NaN1     NaN         NaN         NaN         NaN         NaN2     3.0         9.0         1.0         5.0         NaN3     1.0         8.0         NaN         NaN         NaN
随时随地看视频慕课网APP

相关分类

Python
我要回答