[英]Pandas dataframe merging rows to remove NaN
我有一個帶有某些NaN的數據框:
hostname period Teff
51 Peg 4.2293 5773
51 Peg 4.231 NaN
51 Peg 4.23077 NaN
55 Cnc 44.3787 NaN
55 Cnc 44.373 NaN
55 Cnc 44.4175 NaN
55 Cnc NaN 5234
61 Vir NaN 5577
61 Vir 38.021 NaN
61 Vir 123.01 NaN
具有相同“主機名”的行均引用同一對象,但是如您所見,某些條目在各個列下均具有NaN。 我想合並同一主機名下的所有行,以便在每列中保留第一個有限值(如果所有值均為NaN,則刪除該行)。 因此結果應如下所示:
hostname period Teff
51 Peg 4.2293 5773
55 Cnc 44.3787 5234
61 Vir 38.021 5577
您將如何去做?
使用groupby.first
; 它采用第一個非NA值 :
df.groupby('hostname')[['period', 'Teff']].first().reset_index()
# hostname period Teff
#0 Cnc 44.3787 5234
#1 Peg 4.2293 5773
#2 Vir 38.0210 5577
或使用自定義聚合功能手動執行此操作:
df.groupby('hostname')[['period', 'Teff']].agg(lambda x: x.dropna().iat[0]).reset_index()
這要求每個組至少具有一個非NA值。
編寫自己的函數來處理邊緣情況:
def first_(g):
non_na = g.dropna()
return non_na.iat[0] if len(non_na) > 0 else pd.np.nan
df.groupby('hostname')[['period', 'Teff']].agg(first_).reset_index()
# hostname period Teff
#0 Cnc 44.3787 5234
#1 Peg 4.2293 5773
#2 Vir 38.0210 5577
這是您需要的嗎?
pd.concat([ df1.apply(lambda x: sorted(x, key=pd.isnull)) for _, df1 in df.groupby('hostname')]).dropna()
Out[343]:
hostname period Teff
55 Cnc 44.3787 5234.0
51 Peg 4.2293 5773.0
61 Vir 38.0210 5577.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.