我有一个包含一些NaNs的数据帧:
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具有相同"hostname“的行都引用相同的对象,但如您所见,一些条目在不同列下具有NaNs。我想合并同一主机名下的所有行,以便保留每列中的第一个有限值(如果所有值都为NaN,则删除该行)。因此,结果应该如下所示:
hostname period Teff
51 Peg 4.2293 5773
55 Cnc 44.3787 5234
61 Vir 38.021 5577你会怎么做呢?
发布于 2018-03-01 00:34:07
使用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发布于 2018-03-01 00:36:09
这是你需要的吗?
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.0https://stackoverflow.com/questions/49034202
复制相似问题