透视数据帧并计算“columns”参数

2024-10-03 15:23:54 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数据帧:

import pandas as pd

df = pd.DataFrame()
df['ID'] = [1, 1, 1, 2, 2]
df['Type'] = ['A', 'B', 'Q', 'B', 'R']
df['Status'] = [0, 0, 1, 0, 1]
>>> df
   ID Type  Status
0   1    A       0
1   1    B       0
2   1    Q       1
3   2    B       0
4   2    R       1
>>> 

我想按“ID”对这个数据帧进行分组,并对其进行整形,以便组中的每个项都有一个“Type”变量和一个“Status”变量。见下表:

   Type1 Type2 Type3  Status1  Status2  Status3
ID                                             
1      A     B     Q        0        0        1
2      B     R   NaN        0        1      NaN

输出数据帧中的行数将取决于任何一组ID中的最大记录数

我相信pivot函数就是我想在这里使用的。但是,它需要一个“columns”参数,我认为它应该是每个组中每个项的ID。我有一个非常笨拙的计算方法,我很欣赏关于更好的计算方法的建议:

>>> g=df.groupby('ID')
>>> df['IDinGroup']=[item for sublist in [range(1,len(i[1])+1) for i in g] for item in sublist]
>>> df
   ID Type  Status  IDinGroup
0   1    A       0          1
1   1    B       0          2
2   1    Q       1          3
3   2    B       0          1
4   2    R       1          2
>>> 

然后,我可以循环使用“Type”和“Status”变量,对每个变量进行透视,然后将它们合并到一起:

>>> ListOfValues=[]
>>> for ValueCol in ['Type','Status']:
...     f=df.pivot(index='ID',columns='IDinGroup',values=ValueCol)
...     f.columns=[ValueCol+str(Col) for Col in f.columns]
...     f.columns.name=None
...     ListOfValues.append(f)
... 
>>> pd.concat(ListOfValues,1)
   Type1 Type2 Type3  Status1  Status2  Status3
ID                                             
1      A     B     Q        0        0        1
2      B     R   NaN        0        1      NaN
>>> 

我在这里采取了正确的方法吗?如果是这样,有什么更好的方法来计算pivot函数的“columns”参数(每组中每个项目的id)


Tags: columns数据iniddffortypestatus
1条回答
网友
1楼 · 发布于 2024-10-03 15:23:54

试试这个:

import pandas as pd

df = pd.DataFrame()
df['ID'] = [1, 1, 1, 2, 2]
df['Type'] = ['A', 'B', 'Q', 'B', 'R']
df['Status'] = [0, 0, 1, 0, 1]

g = df.groupby("ID")[["Type","Status"]]
df2 = g.apply(pd.DataFrame.reset_index, drop=True).unstack()

结果如下:

   Type         Status       
      0  1    2      0  1   2
ID                           
1     A  B    Q      0  0   1
2     B  R  NaN      0  1 NaN

列是一个多索引,如果要展开它:

df2.columns = [l0 + str(l1+1) for l0, l1 in df2.columns]

输出:

   Type1 Type2 Type3  Status1  Status2  Status3
ID                                             
1      A     B     Q        0        0        1
2      B     R   NaN        0        1      NaN

相关问题 更多 >