情况
考虑一个包含以下列的数据框df
:
- 名为
金额
的一列。此列中的所有值要么是大于 0 的整数,要么是 NaN。 - 名为
property_1
、property_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 值南。
我感觉必须有一种巧妙的方法来通过一些矢量化数据帧操作来完成此任务。有人知 Prop 体如何吗?
最佳答案
您可以使用np.subtract.outer
为第一个条件构造 bool 掩码。第二个 null 条件通过 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
关于python - 根据行相关和列相关条件设置数据帧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54352195/