python pandas groupby multiple columns到on

2024-06-16 13:00:25 发布

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

我想将一个数据帧分组到一个键上,在本例中是clientid。并将该分组中的所有列连接到每个键的一个长行中。在

例如

clientid, name, age, company
1,        tom,  31,  awesome
1,        jen,  26,  argos
2,        bob,  18,  hmv
3,        ted,  12,  mcdonalds
4,        sarah,30,  MnS
4,        mike, 52,  Mns
4,        luke, 75,  argos

想要的结果

^{pr2}$

提出了一个类似的问题和解决办法

df_info = df1.groupby('clientid')['info'].unique().apply(pd.Series).reset_index()
info_len = len([col for col in df_info if str(col).isdigit()])
df_info.columns = ['clientid'] + ['info'] * info_len
df_info

但我找不到如何将此应用于多个列


Tags: 数据nameinfodfagelencolcompany
2条回答

这就带来了一个健康警告,因为离开了允许groupby的结构、出色的性能、强大而干净的语法(所以从某种意义上说,这是一个很难做到的功能!)。。。只是不太讨人喜欢。在

所以我强烈建议不要这样做,因为几乎可以肯定有更好的方法来做你正在做的任何事情。。。在


我想你需要按clientid分组然后提取这些字符串。。。在

In [11]: df1 = df.set_index('clientid')

In [12]: df1
Out[12]:
           name  age    company
clientid
1           tom   31    awesome
1           jen   26      argos
2           bob   18        hmv
3           ted   12  mcdonalds
4         sarah   30        MnS
4          mike   52        Mns
4          luke   75      argos

In [13]: g = df1.groupby(df1.index)

我可能会考虑在每组中使用to_csv

^{pr2}$

另一种方法是:

In [15]: g.apply(lambda x: pd.concat([row for _, row in x.iterrows()]).values)
Out[15]:
clientid
1                         [tom, 31, awesome, jen, 26, argos]
2                                             [bob, 18, hmv]
3                                       [ted, 12, mcdonalds]
4           [sarah, 30, MnS, mike, 52, Mns, luke, 75, argos]
dtype: object

你得稍微修改一下才能找到正确的标题:

In [16]: list(df1.columns) * g.apply(len).max()
Out[16]: ['name', 'age', 'company', 'name', 'age', 'company', 'name', 'age', 'company']

因此,您可以执行以下操作:

In [21]: s = g.apply(lambda x: pd.concat([row for _, row in x.iterrows()]).values).apply(lambda row: ','.join([str(x) for x in row]))

In [22]: s.name = ','.join(list(df1.columns) * g.apply(len).max())

In [23]: s.to_frame().to_csv(quotechar=" ")  # Note: this is a hack since quoting=0 seems to be ignored
Out[23]: 'clientid, name,age,company,name,age,company,name,age,company \n1, tom,31,awesome,jen,26,argos \n2, bob,18,hmv \n3, ted,12,mcdonalds \n4, sarah,30,MnS,mike,52,Mns,luke,75,argos \n'

我尝试了几种方法,并提出了一个修改版本的安迪,我发现效果很好。在

grouped = df1.groupby('clientid')
flattenedSeries = grouped.apply(lambda x: x.to_csv(header=False, index=False, line_terminator=','))
flattenedSeries = pd.DataFrame(flattenedSeries, columns=['data'])
ready = flattenedSeries['data'].apply(lambda x: pd.Series(x.split(',')))

新建列标题

^{pr2}$

添加神秘栏以匹配在中创建的空白pd系列(x.拆分(',')

newcolumns = newcolumns + ['extra']
ready.columns = newcolumns

为索引指定一种类型以帮助将来的合并

ready.index= ready.index.astype('int64')

如果行终止符用于列的任何数据中,则可以更改它。在

相关问题 更多 >