我希望能够根据第一列的值可变地更改列值。
假设我有一个数据框如下:
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
您可以获得
values
的df["col_ind"]
,遍历它们并将slice
设置为np.nan
:
vals = df["col_ind"].values
for i, v in enumerate(vals):
df.iloc[i, -v:] = np.nan
你使用
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
3 NaN NaN NaN
2 d NaN NaN
1 g h NaN
让我们使用广播来检查可以屏蔽的索引
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