列表中的分组数据框列
Group dataframe columns in lists
我有一个如下所示的数据框:
| id | A | B | C | D |
| 1 | 50 | 51 | 52 | 53 |
| 2 | 70 | 71 | 72 | 73 |
| 1 | 80 | 81 | 82 | 83 |
| 1 | 90 | 91 | 92 | 93 |
| 2 | 40 | 41 | 42 | 43 |
我想把它分组到 'id' 列,这样每一行都是列表的形式。
预期输出:
| id | A | B | C | D |
| 1 | [50,80,90] | [51,81,91] | [52,82,92] | [53,83,93] |
| 2 | [70,40] | [71,41] | [72,42] | [73,43] |
说明:
A 列中 id 1 的值都在一个列表中,与其他列表类似。列表的长度取决于初始数据框中该 ID 的记录数。
我的做法:
df_grouped = df.groupby(['id'])['A'].apply(lambda x: list(x)).reset_index().merge(df.groupby(['id'])['B'].apply(lambda x: list(x)).reset_index().merge(df.groupby(['id'])['C'].apply(lambda x: list(x)).reset_index().merge(df.groupby(['id'])['D'].apply(lambda x: list(x)).reset_index()),on=['id'],how='left'))
虽然这给了我想要的输出,但它对于大型数据帧来说很慢,我觉得这不是很理想,而且我们每次都在 id 上分组并合并。
应该有一种方法,我在 id 上分组一次并做一些事情 columns.tolist() 并且它给出相同的输出。
如有任何帮助,我们将不胜感激。谢谢
使用GroupBy.agg
:
#all columns without id
df_grouped = df.groupby('id').agg(list).reset_index()
或者:
#columns specified in list
df_grouped = df.groupby('id')[['A','B','C','D']].agg(list).reset_index()
print (df_grouped)
id A B C D
0 1 [50, 80, 90] [51, 81, 91] [52, 82, 92] [53, 83, 93]
1 2 [70, 40] [71, 41] [72, 42] [73, 43]
我有一个如下所示的数据框:
| id | A | B | C | D |
| 1 | 50 | 51 | 52 | 53 |
| 2 | 70 | 71 | 72 | 73 |
| 1 | 80 | 81 | 82 | 83 |
| 1 | 90 | 91 | 92 | 93 |
| 2 | 40 | 41 | 42 | 43 |
我想把它分组到 'id' 列,这样每一行都是列表的形式。
预期输出:
| id | A | B | C | D |
| 1 | [50,80,90] | [51,81,91] | [52,82,92] | [53,83,93] |
| 2 | [70,40] | [71,41] | [72,42] | [73,43] |
说明: A 列中 id 1 的值都在一个列表中,与其他列表类似。列表的长度取决于初始数据框中该 ID 的记录数。
我的做法:
df_grouped = df.groupby(['id'])['A'].apply(lambda x: list(x)).reset_index().merge(df.groupby(['id'])['B'].apply(lambda x: list(x)).reset_index().merge(df.groupby(['id'])['C'].apply(lambda x: list(x)).reset_index().merge(df.groupby(['id'])['D'].apply(lambda x: list(x)).reset_index()),on=['id'],how='left'))
虽然这给了我想要的输出,但它对于大型数据帧来说很慢,我觉得这不是很理想,而且我们每次都在 id 上分组并合并。 应该有一种方法,我在 id 上分组一次并做一些事情 columns.tolist() 并且它给出相同的输出。
如有任何帮助,我们将不胜感激。谢谢
使用GroupBy.agg
:
#all columns without id
df_grouped = df.groupby('id').agg(list).reset_index()
或者:
#columns specified in list
df_grouped = df.groupby('id')[['A','B','C','D']].agg(list).reset_index()
print (df_grouped)
id A B C D
0 1 [50, 80, 90] [51, 81, 91] [52, 82, 92] [53, 83, 93]
1 2 [70, 40] [71, 41] [72, 42] [73, 43]