首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas数据帧合并行以删除NaN

Pandas数据帧合并行以删除NaN
EN

Stack Overflow用户
提问于 2018-03-01 00:25:55
回答 2查看 6.2K关注 0票数 3

我有一个包含一些NaNs的数据帧:

代码语言:javascript
复制
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,则删除该行)。因此,结果应该如下所示:

代码语言:javascript
复制
hostname period Teff
51 Peg  4.2293  5773
55 Cnc  44.3787 5234
61 Vir  38.021  5577

你会怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-01 00:34:07

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

代码语言:javascript
复制
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

或者使用自定义聚合函数手动执行此操作:

代码语言:javascript
复制
df.groupby('hostname')[['period', 'Teff']].agg(lambda x: x.dropna().iat[0]).reset_index()

这要求每个组至少有一个非NA值。

编写自己的函数来处理边缘情况:

代码语言:javascript
复制
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
票数 9
EN

Stack Overflow用户

发布于 2018-03-01 00:36:09

这是你需要的吗?

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49034202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档