我想将groupby结果转换为平面DataFrame。
import pandas
df1 = pandas.DataFrame( {
"x" : ["A", "B", "C", "A", "B" ,"B"] ,
"y" : [ 1, 2, 3, 4, 5, 6]} )
g1 = df1.groupby(["x"]).max().reset_index()
print(g1)预期输出DataFrame如下:
x y1 y2 y3
0 A 1 4 0
1 B 2 5 6
2 C 3 0 0如果值不存在,则默认使用0。
发布于 2021-08-31 03:43:47
尝试将groupby.agg与add_prefix配合使用,将fillna与reset_index配合使用。
如下所示:
g1 = df1.groupby('x')['y'].agg(list).agg(pd.Series).add_prefix('y').fillna(0).reset_index()
print(g1)或者,如果您关心列名,可以尝试在1 .__add__中以一种灵活的方式使用rename
g1 = df1.groupby('x')['y'].agg(list).agg(pd.Series).rename(1 .__add__, axis=1).add_prefix('y').fillna(0).reset_index()输出:
x y1 y2 y3
0 A 1.0 4.0 0.0
1 B 2.0 5.0 6.0
2 C 3.0 0.0 0.0发布于 2021-08-31 03:41:25
我们可以使用pivot_table索引是'x‘列,我们可以在x上使用groupby cumcount来枚举行,以获得新列1、2、3等的位置y值,并将fill_value设置为0,以设置缺少的默认值( fill_value优于fillna的优点是不引入NaN,因此dtype不会更改为浮点型)。
最后,add_prefix to columns和reset_index以匹配所需的输出:
out = (
df1.pivot_table(index='x',
columns=df1.groupby('x').cumcount() + 1,
values='y',
fill_value=0)
.add_prefix('y')
.reset_index()
)out
x y1 y2 y3
0 A 1 4 0
1 B 2 5 6
2 C 3 0 0https://stackoverflow.com/questions/68992544
复制相似问题