2016-11-20 83 views
1

我有以下大熊貓DataFrame有條件更換爲大熊貓據幀

ID COL1 COL2 
123 1  ABC 
123 1  CCC 
123 NaN AVV 
345 2  FGG 
345 NaN FRG 
345 NaN FGT 

我需要替換在以基於相同IDCol1所有NaN值以得到這樣的結果:

ID COL1 COL2 
123 1  ABC 
123 1  CCC 
123 1  AVV 
345 2  FGG 
345 2  FRG 
345 2  FGT 

我可以寫for循環,但是對於我的數據集執行腳本需要很長時間。是否有任何有條件的替換功能?

+0

'df.groupby('ID').ffill().bfill()'給你需要什麼? – Psidom

+0

@Psidom:是的,它的確如此。謝謝。唯一的問題是需要很長時間才能完成1GB數據的計算。 – duckertito

+0

試試'df.sort_values(['ID','COL1']).ffill()',這似乎快了3〜4倍比以上方法。它將NaN值排序到數據幀的末尾,並只使用'ffill()'方法填充缺失的值。 – Psidom

回答

1

與開始一個例子如下:

df = pd.DataFrame({'ID': list(range(10)), 'COL1': [np.random.choice([1,np.nan]) for _ in range(10)]}) 
df = pd.concat([df]*100000).reset_index(drop = True) 

df.head() 

# COL1 ID 
#0 NaN 0 
#1 1.0 1 
#2 1.0 2 
#3 NaN 3 
#4 1.0 4 

您可以使用向前填充和落後填充每個組內的方法來填補缺失值:

%timeit df.groupby('ID').ffill().bfill() 
1 loop, best of 3: 212 ms per loop 

或另一種方法是通過IDCOL1到值進行排序,這首先梳理ID然後在每個ID內排序COL1,這會將所有缺失值推到每個ID的末尾,然後您可以使用ffill(),這似乎比ffill(),bfill()種上面的方法,在這個例子中:

%timeit df.sort_values(['ID', 'COL1']).ffill() 
10 loops, best of 3: 71.6 ms per loop 

如果有其他不需要的字符串,你可以調用替換法NaN首先替換字符串。例如,如果數據框中有空字符串要填寫。你可以做df.replace('', np.nan).sort_values(['ID', 'COL1']).ffill()

1

如何使用Series.isnull()來選擇行和Series.map()來做條件替換?

import pandas as pd 
import numpy as np 

df = pd.DataFrame({ 
    'ID': [123, 123, 123, 345, 345, 345], 
    'COL1': [1, 1, np.nan, 2, np.nan, np.nan], 
    'COL2':['ABC', 'CCC', 'AVV', 'FGG', 'FRG', 'FGT']}, 
    columns=['ID','COL1', 'COL2']) 

print df 
mapping = {123: 1, 345: 2} 
df.loc[df['COL1'].isnull(), 'COL1'] = df['ID'].map(mapping) 
print df 

前:

後:

ID COL1 COL2 
0 123 1.0 ABC 
1 123 1.0 CCC 
2 123 1.0 AVV 
3 345 2.0 FGG 
4 345 2.0 FRG 
5 345 2.0 FGT 

編輯:要建立mapping編程,您可以使用下面兩行代碼:

df_unique = df.loc[df['COL1'].notnull()].groupby('ID').nth(0) 
mapping = pd.Series(df_unique['COL1'].values, index=df_unique.index).to_dict() 
+0

我應該手動定義'映​​射嗎? – duckertito

+0

如果你解釋如何自動創建'mapping',你的解決方案是非常有趣的,並且似乎很靈活。謝謝。 – duckertito

+0

我添加了一個編輯,自動創建'mapping'。我假設我的代碼比Psidom的解決方案慢,但希望對其他人有用。 – MarredCheese