Pandas 将数据帧groupby行保存为正好两行

Pandas 将数据帧groupby行保存为正好两行,pandas,dataframe,pandas-groupby,python-3.8,Pandas,Dataframe,Pandas Groupby,Python 3.8,我得到了一个数据帧,我想根据一个特定的列按行分组。每组中的行数至少为4行,最多为50行。我想将组中的一列保存为两行。如果groupsize是偶数,我们假设2n,那么n行在一行,其余的n行在第二行。如果是奇数,n+1和n或n和n+1就可以了 比如说, import pandas as pd from io import StringIO data = """ id,name 1,A 1,B 1,C 1,D 2,E 2,F 2,ds 2,G 2, dsds "

我得到了一个数据帧,我想根据一个特定的列按行分组。每组中的行数至少为4行,最多为50行。我想将组中的一列保存为两行。如果groupsize是偶数,我们假设
2n
,那么
n
行在一行,其余的
n
行在第二行。如果是奇数,
n+1
n
n
n+1
就可以了

比如说,

import pandas as pd
from io import StringIO

data = """
id,name
1,A
1,B
1,C
1,D
2,E
2,F
2,ds
2,G
2, dsds
"""
df = pd.read_csv(StringIO(data))
我要分组方式
id

df.groupby('id',sort=False)

然后得到一个数据帧,比如

    id  name
0   1   A B
1   1   C D
2   2   E F ds
3   2   G dsds

这是一个有点复杂的方法,但它做的工作

def func(s: pd.Series):
    mid = max(s.shape[0]//2 ,1)
    l1 = ' '.join(list(s[:mid]))
    l2 = ' '.join(list(s[mid:]))
    return [l1, l2]

df_new = df.groupby('id').agg(func)

df_new["name1"]= df_new["name"].apply(lambda x: x[0])
df_new["name2"]= df_new["name"].apply(lambda x: x[1])


df = df_new.drop(labels="name", axis=1).stack().reset_index().drop(labels = ["level_1"], axis=1).rename(columns={0:"name"}).set_index("id")

可能不是最有效的解决方案,但它可以:

将numpy导入为np
df=df.sort_值('id')
#接下来的3行:为每组找到分隔符
df['range_idx']=范围(0,df.shape[0])
df['mean\u rank\u group']=df.groupby(['id'])['range\u idx']变换(np.mean)
df['separate_column']=df['range_idx']
你能试试df.groupby([df.index//2,df['id']]).agg(','.join)@Manakin我需要每个组的行。您的解决方案为id 2提供了3行