如何使用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()
'df.groupby('ID').ffill().bfill()'給你需要什麼? – Psidom
@Psidom:是的,它的確如此。謝謝。唯一的問題是需要很長時間才能完成1GB數據的計算。 – duckertito
試試'df.sort_values(['ID','COL1']).ffill()',這似乎快了3〜4倍比以上方法。它將NaN值排序到數據幀的末尾,並只使用'ffill()'方法填充缺失的值。 – Psidom