Pandas数据帧合并行以删除NaN

问题描述 投票:0回答:2

我有一些带有一些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

你会怎么做呢?

python pandas pandas-groupby
2个回答
2
投票

使用groupby.first;它需要first non NA value

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

1
投票

这是你需要的吗?

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
© www.soinside.com 2019 - 2024. All rights reserved.