Python 将dataframe的行与同一组合并,并将值分配给新列

Python 将dataframe的行与同一组合并,并将值分配给新列,python,python-3.x,pandas,pandas-groupby,Python,Python 3.x,Pandas,Pandas Groupby,我想将dataframe的行与同一组组合起来,并将值分配给新列 以前 x y group 0 0.333333 1.000000 0 1 0.750000 0.137931 0 2 1.000000 0.270115 0 3 0.272727 1.000000 1 4 0.727273 0.124294 1 5 1.000000 0.355932 1 6

我想将dataframe的行与同一组组合起来,并将值分配给新列

以前

     x          y         group
0   0.333333    1.000000    0
1   0.750000    0.137931    0
2   1.000000    0.270115    0
3   0.272727    1.000000    1
4   0.727273    0.124294    1
5   1.000000    0.355932    1
6   0.272727    1.000000    2
7   0.727273    0.096591    2
8   1.000000    0.363636    2
9   0.272727    1.000000    3
10  0.727273    0.105556    3
11  1.000000    0.416667    3
12  0.272727    1.000000    4
13  0.727273    0.181818    4
14  1.000000    0.443182    4
之后


以下是透视表的一种方法:

# rank of the row within each group
cats = df.groupby('group').group.rank('first').astype(int)

# use pivot_table to transform data
new_df = pd.pivot_table(df, index='group', columns=cats)

# rename to get desired columns
new_df.columns = [f'{x}{y}' for x,y in new_df.columns]
输出:

             x1        x2   x3   y1        y2        y3
group                                                  
0      0.333333  0.750000  1.0  1.0  0.137931  0.270115
1      0.272727  0.727273  1.0  1.0  0.124294  0.355932
2      0.272727  0.727273  1.0  1.0  0.096591  0.363636
3      0.272727  0.727273  1.0  1.0  0.105556  0.416667
4      0.272727  0.727273  1.0  1.0  0.181818  0.443182

您可以使用groupby和pivot函数来完成它,如

df=pd.DataFrame([('0','0.333333','1.000000','0'),('1','0.750000','0.137931','0'),('2','1.000000','0.270115','0'),('3','0.2727','1.000000','1'),('4','0.727273','0.124294','1'),('5','1.000000','0.355932','1'),('6','0.2727227','1.000000 2','2'),('7','0.72727273','0.368',',('9','0.272727','1.000000','3'),('10','0.727273','0.105556','3'),('11','1.000000','0.416667','3'),('12','0.272727','1.000000','4'),('13','0.727273','0.181818','4'),('14','1.000000','0.443182','4'),列=('id','x','y','group'))
df2=df.groupby(“集团”)\
.apply(lambda组:group.assign(ind=np.arange(len(group)))\
.reset_索引(drop=True)
df2=df2.pivot(index=“ind”,columns=“group”,value=[“x”,“y”])
df2.columns=list(映射(lambda x:“”.join(x),df2.columns))
df2

不使用透视表:

groups=df.groupby('group')['group'].apply(lambda x: x.eq(x.shift()).cumsum())
new_df=pd.concat([df.groupby(groups)['x','y'].get_group(key).add_suffix(str(key+1)).reset_index(drop=True) for key in groups.unique()],axis=1)
print(new_df)



         x1   y1        x2        y2   x3        y3
0  0.333333  1.0  0.750000  0.137931  1.0  0.270115
1  0.272727  1.0  0.727273  0.124294  1.0  0.355932
2  0.272727  1.0  0.727273  0.096591  1.0  0.363636
3  0.272727  1.0  0.727273  0.105556  1.0  0.416667
4  0.272727  1.0  0.727273  0.181818  1.0  0.443182

小组总是分成3行吗?检查Q10和Q11
groups=df.groupby('group')['group'].apply(lambda x: x.eq(x.shift()).cumsum())
new_df=pd.concat([df.groupby(groups)['x','y'].get_group(key).add_suffix(str(key+1)).reset_index(drop=True) for key in groups.unique()],axis=1)
print(new_df)



         x1   y1        x2        y2   x3        y3
0  0.333333  1.0  0.750000  0.137931  1.0  0.270115
1  0.272727  1.0  0.727273  0.124294  1.0  0.355932
2  0.272727  1.0  0.727273  0.096591  1.0  0.363636
3  0.272727  1.0  0.727273  0.105556  1.0  0.416667
4  0.272727  1.0  0.727273  0.181818  1.0  0.443182