查找每个索引的每个列的第一个非空出现的最佳方法?

时间:2019-04-25 19:38:26

标签: python-3.x pandas dataframe

我有一个看起来像这样的数据框:

ItemID    Attribute    CostGrade    RelatedTo
---------------------------------------------
01A       tya        
01A       van
01A                     03a
01A                                 03B
01A                     02i
01A       lof           
01A                     o9g oa      
01A                                 07N
02B       ova           
02B                     39b         
02B       aga
04A       val
04A                     rg0
04A                     va0
04A       hla

如您所见,对于每一行,实际上只有两个值:ItemID和Attribute,CostGrade或RelatedTo的非空值。

我想将ItemID转换为唯一索引,以便每个ItemID仅具有一行,并接受任何行(无关紧要,可以是第一个,最后一个或随机的,因为它们都是有效的,并且组合是无关)来自各列的非null值。所需的输出如下所示:

ItemID    Attribute    CostGrade    RelatedTo
---------------------------------------------
01A       tya          03a          03B
02B       ova          39b          NaN
04A       hla          rg0          NaN

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

尝试使用groupbybfilliloc

df.groupby('ItemID', as_index=False).apply(lambda x: x.bfill().iloc[0])

输出:

  ItemID Attribute CostGrade RelatedTo
0    01A       tya       03a       03B
1    02B       ova       39b       NaN
2    04A       val       rg0       NaN

答案 1 :(得分:0)

我认为这可以满足您的需求:

# ...if it's not already really NaN, do this
#import numpy as np
#df = df.replace('', np.nan)

df.groupby('ItemID').apply(lambda x: x.fillna(method='bfill').fillna(method='ffill')).drop_duplicates(subset='ItemID')

前后交替执行fillna应该确保该组中有任何东西,您会得到一些东西。