首页 > 解决方案 > Pandas groupby 折叠第一行组

问题描述

我有一个系统可以让我以这种格式的表格导出数据:​</p>

data = {'record_id':[1,1,1,1,2,2,3,3,3],
        'name':['AA',"","","",'BB',"",'CC',"",""],
        'data':["",'foo1','foo2','foo3',"",'foo4',"",'foo5','foo6']}
df = pd.DataFrame(data)
print(df)
   record_id name  data
0          1   AA      
1          1       foo1
2          1       foo2
3          1       foo3
4          2   BB      
5          2       foo4
6          3   CC      
7          3       foo5
8          3       foo6

其中有很多列,如“数据”,它们可以有任何不一定遵循模式的值。我需要将数据转换成这种格式:


data_out = {'name':['AA','AA','AA','BB','CC','CC'],'data':['foo1','foo2','foo3','foo4','foo5','foo6']}
df_out = pd.DataFrame(data_out)
print(df_out)
  name  data
0   AA  foo1
1   AA  foo2
2   AA  foo3
3   BB  foo4
4   CC  foo5
5   CC  foo6

我已经尝试阅读文档gropuby并搜索类似问题,但我找不到将每组的第一 2 行折叠成 1 行的方法。

标签: pythonpandaspandas-groupby

解决方案


使用df.replace-

df = df.replace('', np.nan)
df['name'] = df['name'].ffill()
df = df.dropna(subset=['data'])

输出

   record_id name  data
1          1   AA  foo1
2          1   AA  foo2
3          1   AA  foo3
5          2   BB  foo4
7          3   CC  foo5
8          3   CC  foo6

您可以选择删除末尾record_id带有 a 的列以获得所需的输出.drop()df_out


推荐阅读