python - 根据行相关和列相关条件设置数据帧值

标签 python pandas dataframe

情况

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

  • 名为金额的一列。此列中的所有值要么是大于 0 的整数,要么是 NaN。
  • 名为 property_1property_2property_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/

相关文章:

Python 从字典更新对象

python - 如何统计 TCPServer 中已连接的客户端?

python - 将数据帧转换为不带括号的记录列表

python - 计算年份数据的逐月和逐年变化

python - 将新的日期时间添加到具有值的日期时间索引 Pandas 数据框

python - 将一列交换为一行

python - 比较 bool 系列

python - 在 Python 中添加到本地命名空间?

python - 谁能解释我在 tensorflow 中的错误?

python - pandas:如何进行多个 groupby-apply 操作