Pandas 将数据帧groupby行保存为正好两行
我得到了一个数据帧,我想根据一个特定的列按行分组。每组中的行数至少为4行,最多为50行。我想将组中的一列保存为两行。如果groupsize是偶数,我们假设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 "
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行