【问题标题】:Collapsing rows with NaN entries in pandas dataframe在 pandas 数据框中折叠带有 NaN 条目的行
【发布时间】:2019-03-24 18:54:44
【问题描述】:

我有一个带有数据行的 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

即同一个 objectID 通常有多个条目,但有时/通常这些条目具有 NA。

因此,我只是在寻找一种结合 ObjectID 并报告非 NA 条目的方法,例如以上折叠为::

object_id_0001    AAA    Mac    organic
object_id_0002    ABC    Win    NA

【问题讨论】:

标签: python pandas dataframe rows nan


【解决方案1】:

又快又脏

这很有效,并且已经有很长时间了。但是,有些人声称这是一个可以修复的错误。按照目前的实现,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

stack

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()

【讨论】:

  • 不错! 又快又脏确实;}(当然不是反对者)
  • @piRSquared 好的,很有趣。我刚刚检查了我拥有的真实数据文件上的 pd.concat 方法,并且它运行,但它没有选择 NaN 上的数字数据。我认为这是当带有 NaN 的行在 之前 带有您想要的数据的行时。
  • 您的 'NA' 实际上是空值吗?或者它们是字符串'NA'?
  • 好的。很确定 pd.concat 和 stack 方法在这里工作。非常感谢。
【解决方案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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 不错的答案 (-:
    猜你喜欢
    • 2021-08-13
    • 2017-09-16
    • 2013-09-22
    • 1970-01-01
    • 2021-01-17
    • 2020-04-11
    • 2021-12-21
    • 2013-12-13
    • 2018-04-24
    相关资源
    最近更新 更多