提问人:thefrollickingnerd 提问时间:3/9/2023 最后编辑:rajendrathefrollickingnerd 更新时间:3/9/2023 访问量:74
根据行条件将变量列值设置为 nan
Set variable column values to nan based on row condition
问:
我希望能够根据第一列的值可变地更改列值。
假设我有一个数据帧,如下所示:
col_ind col_1 col_2 col_3
3 a b c
2 d e f
1 g h i
我实际上想做
df.loc[:, df.columns[-df['col_ind']:]] = np.nan
这将导致:
col_ind col_1 col_2 col_3
3 nan nan nan
2 d nan nan
1 g h nan
答:
1赞
Marcelo Paco
3/9/2023
#1
您可以获取 的 ,遍历它们并将 设置为 :values
df["col_ind"]
slice
np.nan
vals = df["col_ind"].values
for i, v in enumerate(vals):
df.iloc[i, -v:] = np.nan
评论
1赞
thefrollickingnerd
3/9/2023
是的,这有效,但我希望有一个更有效的解决方案。这非常昂贵。谢谢
1赞
rajendra
3/9/2023
#2
你用 .(编辑:借用@marcelo-paco的代码)apply
result_type='broadcast'
def make_nan(row):
row[-row[0]:] = np.nan
return row
df = pd.DataFrame({'col_ind': [3, 2, 1], 'col_1': ['a', 'd', 'g'], 'col_2': ['b', 'e', 'h'], 'col_3': ['c', 'f', 'i']})
df[:] = df.apply(make_nan, axis=1, result_type='broadcast')
df
这将提供:
col_ind col_1 col_2 col_3
3 NaN NaN NaN
2 d NaN NaN
1 g h NaN
评论
0赞
thefrollickingnerd
3/9/2023
'row[-row[0]:]' 是伪代码吗?不需要指定 iloc 吗?
0赞
rajendra
3/9/2023
它不是伪代码。它使用第一个元素来索引其余元素。
0赞
thefrollickingnerd
3/9/2023
此方法使我的笔记本内核崩溃。同样在我的代码中,我想使用一个命名列,我已将 0 替换为“col name”,我认为这很好吗?
0赞
rajendra
3/9/2023
这假定col_ind中的值介于 1 和 3 之间。不确定“将 0 替换为'col name'”是什么意思。您可以进行编辑并更新您的问题。
0赞
thefrollickingnerd
3/9/2023
我在示例中使用了模拟 df,但我的实际 df 更大,因此我没有使用条件列的列索引,而是使用了列名。大概是相同的语法。
1赞
Driftr95
3/9/2023
#3
您可以使用当前列的切片创建新列,然后替换
for i, cn in enumerate(df.columns,1):
df[cn] = [*[np.nan]*i, *df[cn].loc[i:]]
5赞
Shubham Sharma
3/9/2023
#4
让我们使用广播来检查可以屏蔽的索引
c = df.columns[1:]
m = range(len(c), 0, -1) <= df['col_ind'].values[:, None]
df[c] = df[c].mask(m)
结果
col_ind col_1 col_2 col_3
0 3 NaN NaN NaN
1 2 d NaN NaN
2 1 g h NaN
下一个:想要将数组的元素连接成单个元素
评论