2016-08-16 82 views
5

我正在處理一個相當混亂的數據集,這個數據集一直是個別csv文件,名稱略有不同。重命名csv文件中的列會是太麻煩了,部分原因是我仍然在發現所有的變化,所以我正在尋找確定,在一組列中,在給定的行中,哪個字段不是NaN並且攜帶該前向到一個新的專欄。有沒有辦法做到這一點?熊貓:拿任何一列不是NaN

例如。比方說,我有一個看起來像這樣的數據幀:

Index A  B 
1  15 NaN 
2  NaN 11 
3  NaN 99 
4  NaN NaN 
5  12 14 

比方說,我想要的輸出,這是創建一個新的C柱,使得我的數據幀將如下所示:

Index A  B  C 
1  15 NaN  15 
2  NaN 11  11 
3  NaN 99  99 
4  NaN NaN  NaN 
5  12 14  12 (so giving priority to A over B) 

我該如何做到這一點?

+0

['pd.DataFrame.update'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.update.html) – Kartik

回答

5

對於任意數目的數據幀的colu MNS,您可以備份填補行(.bfill(axis=1)),並採取第一列(.iloc[:, 0]):

df = pd.DataFrame({ 
    'A': [15, None, None, None, 12], 
    'B': [None, 11, 99, None, 14], 
    'C': [10, None, 10, 10, 10]}) 

df['D'] = df.bfill(axis=1).iloc[:, 0] 

>>> df 
    A B C D 
0 15 NaN 10 15 
1 NaN 11 NaN 11 
2 NaN 99 10 99 
3 NaN NaN 10 10 
4 12 14 10 12 
3

如果你只是有2列,最徹底的方法是使用where(語法是where([condition], [value if condition is true], [value if condition is false])(由於某種原因,我花了一段時間來總結我解決這個頭)。

In [2]: df.A.where(df.A.notnull(),df.B) 
Out[2]: 
0 15.0 
1 11.0 
2 99.0 
3  NaN 
4 12.0 
Name: A, dtype: float64 

如果您有兩個以上的列,它可能是簡單的使用maxmin;這將忽略空值,但是你將失去「列prececence」你想:

In [3]: df.max(axis=1) 
Out[3]: 
0 15.0 
1 11.0 
2 99.0 
3  NaN 
4 14.0 
dtype: float64 
0

或者你可以使用 'df.apply' 向列優先A.

def func1(row): 
    A=row['A'] 
    B=row['B'] 
    if A==float('nan'): 
     if B==float('nan'): 
      y=float('nan') 
     else: 
      y=B 
    else: 
     y=A 
    return y 
df['C']=df.apply(func1,axis=1) 
1

試試這個:(此方法允許的優先考慮列flexiblity不依賴於列的順序。)

使用@Alexanders設置。

df["D"] = df["B"] 
df["D"] = df['D'].fillna(df['A'].fillna(df['B'].fillna(df['C']))) 

     A  B  C  D 
0 15.0 NaN 10.0 15.0 
1 NaN 11.0 NaN 11.0 
2 NaN 99.0 10.0 99.0 
3 NaN NaN 10.0 10.0 
4 12.0 14.0 10.0 14.0