我有一個下面的資料框,我的要求是,如果兩列都np.nan沒有變化,如果任一列都有空值,則用0值填充 na。我寫了這段代碼,但為什么它不起作用。請建議。
import pandas as pd
import numpy as np
data = {'Age': [np.nan, np.nan, 22, np.nan, 50,99],
'Salary': [217, np.nan, 262, 352, 570, np.nan]}
df = pd.DataFrame(data)
print(df)
cond1 = (df['Age'].isnull()) & (df['Salary'].isnull())
if cond1 is False:
df['Age'] = df['Age'].fillna(0)
df['Salary'] = df['Salary'].fillna(0)
print(df)
uj5u.com熱心網友回復:
你可以用更新分配它
c = ['Age','Salary']
df.update(df.loc[~df[c].isna().all(1),c].fillna(0))
df
Out[341]:
Age Salary
0 0.0 217.0
1 NaN NaN
2 22.0 262.0
3 0.0 352.0
4 50.0 570.0
5 99.0 0.0
uj5u.com熱心網友回復:
c1 = df['Age'].isna()
c2 = df['Salary'].isna()
df[np.c_[c1 & ~c2, ~c1 & c2]]=0
df
Age Salary
0 0.0 217.0
1 NaN NaN
2 22.0 262.0
3 0.0 352.0
4 50.0 570.0
5 99.0 0.0
uj5u.com熱心網友回復:
tmp=df.loc[(df['Age'].isna() & df['Salary'].isna())]
df.fillna(0,inplace=True)
df.loc[tmp.index]=np.nan
這可能沒有其他答案那么復雜,但對我有用:
- 我首先同時保存包含兩個 Nan 值的行
- 然后按照正常情況填充原始df
- 然后將 np.nan 設定回我們同時保存包含 Nan 的兩行的位置
uj5u.com熱心網友回復:
獲取所有為空的行并where在填充程序中用于排除它們:
bools = df.isna().all(axis = 1)
df.where(bools, df.fillna(0))
Age Salary
0 0.0 217.0
1 NaN NaN
2 22.0 262.0
3 0.0 352.0
4 50.0 570.0
5 99.0 0.0
您的 if 陳述句將不起作用,因為您需要檢查每一行的 True 或 False;cond1是一個系列,不能正確地與 False 進行比較(它只會回傳 False,這并不完全正確),系列中可以有多個 False 和 True。
一種低效的方法是遍歷行:
for row, index in zip(cond1, df.index):
if not row:
df.loc[index] = df.loc[index].fillna(0)
除了效率低下,您還在跟蹤索引位置;pandas 選項嘗試在非常高效的同時抽象該程序,因為回圈是在 C 中
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/464369.html
標籤:熊猫
上一篇:在單個資料框中組合行
