首页 > 解决方案 > 在python中组合元组数据框列表

问题描述

我有一个大型数据集,其中每两行需要组合在一起并组合成一个较长的行,基本上是复制标题并将第二行添加到第一行。这是一个小样本:

df = pd.DataFrame({'ID' : [1,1,2,2],'Var1': ['A', 2, 'C', 7], 'Var2': ['B', 5, 'D', 9]})
print(df)

ID Var1 Var2
1    A    B
1    2    5
2    C    D
2    7    9

我将不得不对我的“ID”行进行分组,因此我运行:

grouped = df.groupby(['ID'])
grp_lst = list(grouped)

这导致了一个按 id 分组的元组列表,其中元素 1 是我想要组合的分组数据框。

期望的结果是一个看起来像这样的数据框:

ID Var1 Var2  ID.1  Var1.1  Var2.1
1    A    B     1       2       5
2    C    D     2       7       9

我必须在一个大型数据集上执行此操作,其中“ID”用于对行进行分组,然后我想基本上将底行添加到顶部结束。

任何帮助将不胜感激,我认为有一种比我做的更简单的方法。

提前致谢!

标签: pythonpandasdataframepandas-groupby

解决方案


让我们试试:

i = df.groupby('ID').cumcount().astype(str)
df_out = df.set_index([df['ID'].values, i]).stack().unstack([2, 1])
df_out.columns = df_out.columns.map('.'.join)

细节:

group上的数据框ID并用于cumcount创建顺序计数器以唯一标识每个行ID

>>> i

0    0
1    1
2    0
3    1
dtype: object

在数据帧中创建多级索引,第一级设置为ID值,第二级设置为上述顺序计数器,然后使用stack后跟unstack以所需格式重塑数据帧:

>>> df_out

  ID Var1 Var2 ID Var1 Var2 #---> Level 0 columns
   0    0    0  1    1    1 #---> Level 1 columns
1  1    A    B  1    2    5
2  2    C    D  2    7    9

Index.map最后使用with展平多级列join

>>> df_out

  ID.0 Var1.0 Var2.0 ID.1 Var1.1 Var2.1
1    1      A      B    1      2      5
2    2      C      D    2      7      9

推荐阅读