英文:
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
英文:
I want to be able to variably change a column value based on the value of the first column.
Say I have a dataframe as follows:
col_ind col_1 col_2 col_3
3 a b c
2 d e f
1 g h i
I effectively want to do
df.loc[:, df.columns[-df['col_ind']:]] = np.nan
Which would result in:
col_ind col_1 col_2 col_3
3 nan nan nan
2 d nan nan
1 g h nan
答案1
得分: 5
让我们使用广播来检查可以被掩盖的索引。
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
英文:
Lets use broadcasting to check the indices which can be masked
c = df.columns[1:]
m = range(len(c), 0, -1) <= df['col_ind'].values[:, None]
df[c] = df[c].mask(m)
Result
col_ind col_1 col_2 col_3
0 3 NaN NaN NaN
1 2 d NaN NaN
2 1 g h NaN
答案2
得分: 1
你可以获取 df["col_ind"]
的 values
,对它们进行迭代并将 slice
设置为 np.nan
:
vals = df["col_ind"].values
for i, v in enumerate(vals):
df.iloc[i, -v:] = np.nan
英文:
You can get the values
of df["col_ind"]
, iterate through them and set the slice
to np.nan
:
vals = df["col_ind"].values
for i, v in enumerate(vals):
df.iloc[i, -v:] = np.nan
答案3
得分: 1
你可以使用apply
并指定result_type='broadcast'
。 (编辑:借用 @marcelo-paco 的代码)
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
0 3 NaN NaN NaN
1 2 d NaN NaN
2 1 g h NaN
英文:
You an use apply
with result_type='broadcast'
. (Edit: borrowing @marcelo-paco's code)
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
This will give:
col_ind col_1 col_2 col_3
3 NaN NaN NaN
2 d NaN NaN
1 g h NaN
答案4
得分: 1
你可以使用当前列的切片创建新列,然后替换原始列的内容。
for i, cn in enumerate(df.columns, 1):
df[cn] = [*[np.nan]*i, *df[cn].loc[i:]]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论