在pandas数据框中折叠具有NaN条目的行

5
我有一个包含数据行的pandas DataFrame:
# objectID        grade  OS     method
object_id_0001    AAA    Mac    organic
object_id_0001    AAA    Mac    NA
object_id_0001    AAA    NA     organic
object_id_0002    NA     NA     NA
object_id_0002    ABC    Win    NA

即,同一对象ID通常会有多个条目,但有时/经常会有NAs。因此,我只是在寻找一种可以合并对象ID并报告非NA条目的方法,例如上面的内容缩小到:

object_id_0001    AAA    Mac    organic
object_id_0002    ABC    Win    NA

为什么不使用 dropna() 函数的 subset 参数?https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html - petezurich
3个回答

8

快速且简单

这种方法有效并已使用了很长时间。但是,有人声称这可能是一个可以修复的错误。目前实现的方式是,first 返回每列中存在的第一个非空元素。

df.groupby('objectID', as_index=False).first()

         objectID grade   OS   method
0  object_id_0001   AAA  Mac  organic
1  object_id_0002   ABC  Win      NaN

pd.concat

pd.concat([
    pd.DataFrame([d.lookup(d.notna().idxmax(), d.columns)], columns=d.columns)
    for _, d in df.groupby('objectID')
], ignore_index=True)

         objectID grade   OS   method
0  object_id_0001   AAA  Mac  organic
1  object_id_0002   ABC  Win      NaN

堆栈

df.set_index('objectID').stack().groupby(level=[0, 1]).head(1).unstack()

               grade   OS   method
objectID                          
object_id_0001   AAA  Mac  organic
object_id_0002   ABC  Win     None

如果偶然出现了字符串('NA'
df.mask(df.astype(str).eq('NA')).groupby('objectID', as_index=False).first()

不错!确实是“快速而肮脏”的代码啊;}(当然不是那个点踩者) - rafaelc
@piRSquared 好的,有趣。我刚刚在我的真实数据文件上检查了pd.concat方法,它可以运行,但它不会选择数值数据而忽略NaN。我认为这是当带有NaN的行位于你想要的数据行之前时发生的情况。 - npross
你的 'NA' 实际上是 null 值吗?还是字符串 'NA' - piRSquared
好的。我相信 pd.concat 和 stack 方法在这里可以起作用。非常感谢。 - npross

3

这将使用bfill+drop_duplicates来完成。

df.groupby('objectID',as_index=False).bfill().drop_duplicates('objectID')
Out[939]: 
         objectID grade   OS   method
0  object_id_0001   AAA  Mac  organic
3  object_id_0002   ABC  Win      NaN

好答案 (-: - piRSquared

2
一种更机械化的替代方式
def aggregate(s):
    u = s[s.notnull()].unique()
    if not u.size: return np.nan
    return u

df.groupby('objectID').agg(aggregate)

                grade   OS      method
objectID            
object_id_0001  AAA     Mac     organic
object_id_0002  ABC     Win     NaN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接