python - 对序列号应用 pandas groupby 以从每列中获取单个值

标签 python python-3.x pandas dataframe pandas-groupby

我有一个看起来像 -

的数据框
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/

相关文章:

python - 属性错误 : 'function' object has no attribute 'upper'

python - Pandas - 如何从数据框中获取索引值

Python - Tkinter - 如何从下拉选项中获取值并将其传递给另一个函数

python - 将 csv 内容写入 .txt 文件,每行一个文件?

python - 基于当前月份的计算列

python - pandas.read_csv 无法导入路径中带有重音符号的文件

pandas - 将 pandas PrettyDict 转换为字典

Python ZeroMQ PUSH/PULL逻辑,为低端puller设置高水位线而不丢失任何消息

python - 在Python中打印所有匹配的JSON字典

python - 如何将 int 转换为包含二进制表示的列表在 python 中快速?