給定一個資料框df,如下所示:
id value1 value2 value3
0 0 22 1 7
1 1 0 0 0
2 2 0 0 0
3 3 4 1 25
4 4 5 0 24
5 5 0 0 3
或者:
df = pd.DataFrame([{'id': 0, 'value1': 22, 'value2': 1, 'value3': 7},
{'id': 1, 'value1': 0, 'value2': 0, 'value3': 0},
{'id': 2, 'value1': 0, 'value2': 0, 'value3': 0},
{'id': 3, 'value1': 4, 'value2': 1, 'value3': 25},
{'id': 4, 'value1': 5, 'value2': 0, 'value3': 24},
{'id': 5, 'value1': 0, 'value2': 0, 'value3': 3}])
我需要對列進行子集化'value1', 'value2', 'value3',如果所有值都按行進行替換0,NaN則替換為0。我怎么能在 Pandas 中做到這一點?
預期的結果將是這樣的:
id value1 value2 value3
0 0 22.0 1.0 7.0
1 1 NaN NaN NaN
2 2 NaN NaN NaN
3 3 4.0 1.0 25.0
4 4 5.0 0.0 24.0
5 5 0.0 0.0 3.0
我試過的代碼:
cols = ['value1', 'value2', 'value3']
df[cols] = df[cols].replace({'0': np.NaN, 0: np.NaN})
uj5u.com熱心網友回復:
使用mask:
df[cols] = df[cols].mask(df[cols].eq(0).all(axis=1))
maskNaN如果條件 ( df[cols].eq(0).all(axis=1)) 是,則自動將行設定為True。
原答案:
我更喜歡mask:
>>> df.set_index('id').mask(df[cols].eq(0).all(axis=1))
value1 value2 value3
id
0 22.0 1.0 7.0
1 NaN NaN NaN
2 NaN NaN NaN
3 4.0 1.0 25.0
4 5.0 0.0 24.0
5 0.0 0.0 3.0
>>>
帶復位索引:
>>> df.set_index('id').mask(df[cols].eq(0).all(axis=1)).reset_index()
id value1 value2 value3
0 0 22.0 1.0 7.0
1 1 NaN NaN NaN
2 2 NaN NaN NaN
3 3 4.0 1.0 25.0
4 4 5.0 0.0 24.0
5 5 0.0 0.0 3.0
>>>
uj5u.com熱心網友回復:
也許:
mask = (df[cols].eq(0).all(axis=1))
df.loc[mask, cols] = np.nan
輸出:
id value1 value2 value3
0 0 22.0 1.0 7.0
1 1 NaN NaN NaN
2 2 NaN NaN NaN
3 3 4.0 1.0 25.0
4 4 5.0 0.0 24.0
5 5 0.0 0.0 3.0
uj5u.com熱心網友回復:
您正在混合型別,您的代碼嘗試比較兩種不同的資料型別并拋出 TypeError:TypeError: Cannot compare types 'ndarray(dtype=float64)' and 'str'
為了使您的代碼作業,您只需'0': np.NaN從 dict 中洗掉或而不是dict傳遞兩個引數:
df[cols] = df[cols].replace(0, float('NaN'))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/353858.html
