python-3.x 根据行条件将变量列值设置为nan

67up9zun  于 2023-03-09  发布在  Python
关注(0)|答案(4)|浏览(119)

我希望能够根据第一列的值可变地更改列值。
假设我有一个 Dataframe ,如下所示:

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
jmp7cifd

jmp7cifd1#

让我们使用广播来检查可以屏蔽的索引

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
xdyibdwo

xdyibdwo2#

你可以得到df["col_ind"]values,迭代它们,并将slice设置为np.nan

vals = df["col_ind"].values
for i, v in enumerate(vals):
    df.iloc[i, -v:] = np.nan
relj7zay

relj7zay3#

您可以将applyresult_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
2q5ifsrm

2q5ifsrm4#

您可以使用当前列的切片创建新列,然后替换

for i, cn in enumerate(df.columns,1): 
    df[cn] = [*[np.nan]*i, *df[cn].loc[i:]]

相关问题