在熊猫数据框中使用NaN条目折叠行

npr*_*oss 3 python rows nan dataframe pandas

我有一个带有数据行的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
Run Code Online (Sandbox Code Playgroud)

即,对于相同的objectID,通常会有多个条目,但有时/通常这些条目具有NA。

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

object_id_0001    AAA    Mac    organic
object_id_0002    ABC    Win    NA
Run Code Online (Sandbox Code Playgroud)

piR*_*red 5

又快又脏

这有效并且已经存在了很长时间。但是,有人声称这是一个可能已修复的错误。按照当前的实现,first如果每个列都存在,则返回第一个非null元素。

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果碰巧是字符串('NA'

df.mask(df.astype(str).eq('NA')).groupby('objectID', as_index=False).first()
Run Code Online (Sandbox Code Playgroud)