我有一个看起来像 -
的数据框SERIAL COUNTRY GOODS VALUE
1 AUSTRALIA NA NA
1 NA STEEL NA
1 NA NA PACIFIC
2 NEW ZEALAND NA NA
2 NA STEEL NA
2 NA NA COAL
3 INDIA NA NA
3 NA WOOL NA
3 NA NA LIMITED
我想根据 SERIAL 将此数据框分组,且值不包含 NA。
它应该看起来像这样 -
SERIAL COUNTRY GOODS VALUE
1 AUSTRALIA STEEL PACIFIC
2 NEW ZEALAND STEEL COAL
3 INDIA WOOL LIMITED
我写的代码是 -
new_df =df.groupby(['SERIAL'])['COUNTRY'].apply(lambda x: x if x is not 'NA')
我也尝试过将其作为用逗号分隔的字符串,然后稍后将它们分开,但它不起作用。
df.groupby(['SERIAL'])['COUNTRY'].apply(lambda x: ','.join(x.unique().astype(str))).reset_index()
有人可以帮助解决这个问题,或者至少告诉我我的方法中的错误。
最佳答案
我认为需要GroupBy.first
如果每个组和列只有一个非 NaN
值:
#if necessary repalce NA to missing values
df = df.replace('NA',np.nan)
df = df.groupby(['SERIAL'], as_index=False).first()
print (df)
SERIAL COUNTRY GOODS VALUE
0 1 AUSTRALIA STEEL PACIFIC
1 2 NEW ZEALAND STEEL COAL
2 3 INDIA WOOL LIMITED
另一个更通用的解决方案是每组向前和向后填充缺失值,然后 drop_duplicates
按所有列:
:
df = df.replace('NA',np.nan)
df = df.groupby(['SERIAL']).apply(lambda x: x.ffill().bfill()).drop_duplicates()
关于python - 对序列号应用 pandas groupby 以从每列中获取单个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51374595/