如何按某些列对 DataFrame 进行分组并在输出中显示选定的列
How to group a DataFrame by some columns and present selected columns in the output
全部。我不知道这最终是 sort_values
还是 groupby
问题。
我有一个包含 5 列的简单 DataFrame:A、B、C、D、E
我想按 A、B、C 分组,结果中有 D 和 E。
我想做一个 groupby(['A','B','C])
并按如下所示分段显示 DataFrame。
我能得到的最接近的结果是 df2 = df.groupby(['A','B','C']).apply(list)
,结果如下:
A B C
----------------------------------------------
fooA1 fooB1 fooC1 [A, B, C, D, E]
fooB2 fooC2 [A, B, C, D, E]
fooC3 [A, B, C, D, E]
fooB3 fooC4 [A, B, C, D, E]
fooC5 [A, B, C, D, E]
fooB4 fooC6 [A, B, C, D, E]
fooC7 [A, B, C, D, E]
fooA2 ...
这真的很接近我想要的,除了这里 [A, B, C, D, E]
字面意思是 [A, B, C, D, E]
;即列名而不是这些列中的任何实际值。
我能够像这样使用 sort_values
生成报告:
df.sort_values(by=['A','B','C'], inplace=True)
df = df.reset_index()
for index, row in df.iterrows():
print(f"{row['A']} {row['B']} {row['C']} {row['D']} {row['E']}")
产生以下结果:
fooA1 fooB1 fooC1 fooD... fooE...
fooA1 fooB2 fooC2 fooD... fooE...
fooA1 fooB2 fooC3 fooD... fooE...
fooA1 fooB3 fooC4 fooD... fooE...
fooA1 fooB3 fooC5 fooD... fooE...
fooA1 fooB4 fooC6 fooD... fooE...
fooA1 fooB4 fooC7 fooD... fooE...
fooA2 ...
这足以满足我最终的需要,但我真的很想了解 groupby
哪里出了问题,以及如何生成更清晰的报告。
非常感谢!
你用对了df2 = df.groupby(['A','B','C']).apply(list)
但不使用 .apply(list)
,而是使用:.agg(lambda x: list(x))
df2 = df.groupby(['A','B','C']).agg(lambda x: list(x))
这将获取所有分组值 A B C,分别来自列表中行 D 和 E 的值。
全部。我不知道这最终是 sort_values
还是 groupby
问题。
我有一个包含 5 列的简单 DataFrame:A、B、C、D、E
我想按 A、B、C 分组,结果中有 D 和 E。
我想做一个 groupby(['A','B','C])
并按如下所示分段显示 DataFrame。
我能得到的最接近的结果是 df2 = df.groupby(['A','B','C']).apply(list)
,结果如下:
A B C
----------------------------------------------
fooA1 fooB1 fooC1 [A, B, C, D, E]
fooB2 fooC2 [A, B, C, D, E]
fooC3 [A, B, C, D, E]
fooB3 fooC4 [A, B, C, D, E]
fooC5 [A, B, C, D, E]
fooB4 fooC6 [A, B, C, D, E]
fooC7 [A, B, C, D, E]
fooA2 ...
这真的很接近我想要的,除了这里 [A, B, C, D, E]
字面意思是 [A, B, C, D, E]
;即列名而不是这些列中的任何实际值。
我能够像这样使用 sort_values
生成报告:
df.sort_values(by=['A','B','C'], inplace=True)
df = df.reset_index()
for index, row in df.iterrows():
print(f"{row['A']} {row['B']} {row['C']} {row['D']} {row['E']}")
产生以下结果:
fooA1 fooB1 fooC1 fooD... fooE...
fooA1 fooB2 fooC2 fooD... fooE...
fooA1 fooB2 fooC3 fooD... fooE...
fooA1 fooB3 fooC4 fooD... fooE...
fooA1 fooB3 fooC5 fooD... fooE...
fooA1 fooB4 fooC6 fooD... fooE...
fooA1 fooB4 fooC7 fooD... fooE...
fooA2 ...
这足以满足我最终的需要,但我真的很想了解 groupby
哪里出了问题,以及如何生成更清晰的报告。
非常感谢!
你用对了df2 = df.groupby(['A','B','C']).apply(list)
但不使用 .apply(list)
,而是使用:.agg(lambda x: list(x))
df2 = df.groupby(['A','B','C']).agg(lambda x: list(x))
这将获取所有分组值 A B C,分别来自列表中行 D 和 E 的值。