2
我有關於上 在熊貓DataFrame
填充NaN
值有條件地非NaN
列的值的問題。爲了說明:灌裝NaN值在一個數據幀熊貓有條件地對非NaN的列的值
import numpy as np
import pandas as pd
print pd.__version__
0.18.1
df = pd.DataFrame({'a': [1, 0, 0, 0, 1],
'b': [0, 1, 0, 0, 0],
'c': [0, 0, 1, 1, 0],
'x': [0.5, 0.2, 0, 0.2, 0],
'y': [0, 0, 0, 1, 0],
'z': [0.1, 0.1, 0.9, 0, 0.4]})
df.ix[[2,4], ['x','y','z']] = np.nan
print df
a b c x y z
0 1 0 0 0.5 0.0 0.1
1 0 1 0 0.2 0.0 0.1
2 0 0 1 NaN NaN NaN
3 0 0 1 0.2 1.0 0.0
4 1 0 0 NaN NaN NaN
現在假設我有一些默認值,依賴於前三列:
default_c = pd.Series([0.5, 0.5, 0.5], index=['x', 'y', 'z'])
default_a = pd.Series([0.2, 0.2, 0.2], index=['x', 'y', 'z'])
換句話說,我想default_c
粘貼在NaN
值第2行,並在4排爲此default_a
貼,我想出了下面的有些不雅的解決方案:
nan_x = np.isnan(df['x'])
is_c = df['c']==1
nan_c = nan_x & is_c
print nan_c
0 False
1 False
2 True
3 False
4 False
dtype: bool
df.ix[nan_c, default_c.index] = default_c.values
print df
a b c x y z
0 1 0 0 0.5 0.0 0.1
1 0 1 0 0.2 0.0 0.1
2 0 0 1 0.5 0.5 0.5
3 0 0 1 0.2 1.0 0.0
4 1 0 0 NaN NaN NaN
有沒有更好的辦法ŧ o使用fillna()
函數執行此操作嗎?
例如,下面是不行的,我猜是因爲我填補了DataFrame
切片:
df.loc[df['a']==1].fillna(default_a, inplace=True)
print df
a b c x y z
0 1 0 0 0.5 0.0 0.1
1 0 1 0 0.2 0.0 0.1
2 0 0 1 0.5 0.5 0.5
3 0 0 1 0.2 1.0 0.0
4 1 0 0 NaN NaN NaN
但這長線做:
df.loc[df['a']==1] = df.loc[df['a']==1].fillna(default_a)
print df
a b c x y z
0 1 0 0 0.5 0.0 0.1
1 0 1 0 0.2 0.0 0.1
2 0 0 1 0.5 0.5 0.5
3 0 0 1 0.2 1.0 0.0
4 1 0 0 0.2 0.2 0.2
不管怎麼說,只是尋求如何使代碼儘可能簡單的建議。
不錯!無需循環遍歷解決方案中的列。 – hobgreenson