我有一个看起来像这样的数据框:
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
任何帮助将不胜感激!
答案 0 :(得分:2)
尝试使用groupby
,bfill
和iloc
:
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应该确保该组中有任何东西,您会得到一些东西。