为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

扬帆大鱼 2021-10-19 17:03:46
情况考虑一个df包含以下列的数据框:一列名为amount. 此列中的所有值要么是大于 0 的整数,要么是 NaN。名为property_1、property_2、 等的多个列property_3。这些列中的值是任意的。一个简单的例子df是:import numpy as npimport pandas as pddata = [    [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_40     2.0         7.0         2.0         4.0         3.01     NaN         8.0         3.0         4.0         2.02     3.0         9.0         1.0         5.0         6.03     1.0         8.0         2.0         4.0         1.0问题我想转换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基本上我想在列名的数字后缀大于amount值或amount值为 NaN 的所有位置设置一个 NaN 值。我觉得必须有一种聪明的方法来通过一些矢量化数据帧操作来实现这一点。有人知道具体如何吗?
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

您可以使用 为您的第一个条件构造布尔掩码np.subtract.outer。fillna(0)由于所有正整数都大于 0,因此通过处理第二个空条件。


# extract integers from columns

ints = df.columns[1:].str.rsplit('_', n=1).str[-1].astype(int)


# perform elementwise comparison after replacing null amounts with 0

bool_arr = np.subtract.outer(ints, df['amount'].fillna(0)).T


# apply Boolean mask to selected columns

df.iloc[:, 1:] = df.iloc[:, 1:].mask(bool_arr > 0)


print(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


查看完整回答
反对 回复 2021-10-19
  • 1 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号