我有一個資料框如下:
A B
0 Morning NaN
1 24 afternoon
2 34 23
3 23 16
4 NaN 13
5 NaN NaN
6 15.5 1
我想要一個新列'sumA',它將為這些單元格 2(字串和NAN除外),所以我寫了下面的代碼:
df['sumA'] = df['A'].apply(lambda x: x 2 if (df['A'].notnull) and (type(df['A'])== int) else x )
我得到了下面的結果,它沒有像我預期的那樣對這些單元格 2。你能幫忙嗎?
A B sumA
0 Morning NaN Morning
1 24 afternoon 24
2 34 23 34
3 23 16 23
4 NaN 13 NaN
5 NaN NaN NaN
6 15.5 1 15.5
uj5u.com熱心網友回復:
如果不是數字,您可以使用errors='coerce'for NaNs 將值轉換為數字,然后添加2,最后如果需要非數字值,請使用fillna:
df['sumA'] = pd.to_numeric(df['A'], errors='coerce').add(2).fillna(df['A'])
print (df)
A B sumA
0 Morning NaN Morning
1 24 afternoon 26.0
2 34 23 36.0
3 23 16 25.0
4 NaN 13 NaN
5 NaN NaN NaN
6 15.5 1 17.5
如果最終只有數字列更好 - 數字或缺失值:
df['sumA'] = pd.to_numeric(df['A'], errors='coerce').add(2)
print (df)
A B sumA
0 Morning NaN NaN
1 24 afternoon 26.0
2 34 23 36.0
3 23 16 25.0
4 NaN 13 NaN
5 NaN NaN NaN
6 15.5 1 17.5
如果需要自定義功能:
#convert to numeric - if strings convert to NaNs
df['A'] = pd.to_numeric(df['A'], errors='coerce')
#pass custom function
df['sumA'] = df['A'].apply(lambda x: x 2 if pd.notna(x) else x )
print (df)
A B sumA
0 NaN NaN NaN
1 24.0 afternoon 26.0
2 34.0 23 36.0
3 23.0 16 25.0
4 NaN 13 NaN
5 NaN NaN NaN
6 15.5 1 17.5
如果真的需要混合數字和非數字:
#convert strings numbers to numbers (float, int)
df['A'] = pd.to_numeric(df['A'], errors='coerce').fillna(df['A'])
#apply function
df['sumA'] = df['A'].apply(lambda x: x 2 if pd.notna(x) and not isinstance(x, str) else x)
print (df)
A B sumA
0 Morning NaN Morning
1 24.0 afternoon 26.0
2 34.0 23 36.0
3 23.0 16 25.0
4 NaN 13 NaN
5 NaN NaN NaN
6 15.5 1 17.5
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446267.html
