【发布时间】:2020-07-10 10:39:25
【问题描述】:
根据数据框列 del 值,查看其他列 col_0-14,然后将该行的值设置为 100(不更新 nan 值)。
数据框看起来像:
id val_1 del col_1 col_2 col_3 col_4 col_5 col_6 col_7 col_8 col_9 col_10 col_11 col_12 col_13 col14
1 13 0 0 0 0 0 0 0 0 0 0 0 0 0
2 11 0 0 0 0 0 0 0 0 0 0 0
3 8 1 0 0 0 0 0 7 7 8
4 6 1 500 1000 1500 2000 2500 3000
作为第 3、4 行的 del,代码应将值替换为 100 直到 val_1 值。
3 8 1 100 100 100 100 100 100 100 100
4 6 1 100 100 100 100 100 100
我试过了:
df.loc[df['del'] == 1, df.columns.str.startswith('col')] = 100
它将所有行值 (col1-14) 替换为 100。有没有办法,我可以控制它直到 val_1 值,而 col 的其余部分保持为 nan 值。 或
在上面的代码之后,我可以使用 val_1 值通过循环逻辑使用 nan 值再次更新行。
def cut_data(row):
for i in range(1, 15):
if i > row['val_1']:
row['col_' + str(i)] = np.NaN
return row
df = df.apply(cut_data, axis=1)
请建议任何替代循环逻辑的方法,即没有循环。
DDL 生成 DataFrame:
df1 = pd.DataFrame({'id': [1, 2, 3, 4],
'val_1': [13, 11, 8, 6],
'del' : [np.nan,np.nan,1,1],
'col1': [0, 0, 0, 500],
'col2': [0, 0, 0, 1000],
'col3': [0, 0, 0, 1500],
'col4': [0, 0, 0, 2000],
'col5' : [0, 0, 0, 2500],
'col6': [0, 0, 7, 3000],
'col7': [0, 0, 7,np.nan ],
'col8': [0, 0, 7, np.nan],
'col9': [0, 0, np.nan, np.nan],
'col10': [0, 0, np.nan, np.nan],
'col11': [0, 0, np.nan, np.nan],
'col12': [0, np.nan, np.nan, np.nan],
'col13': [0, np.nan, np.nan, np.nan],
'col14': [ np.nan, np.nan, np.nan, np.nan]})
谢谢!
【问题讨论】: