pandas 如何根据列标题扩展 Dataframe 行数?

50few1ms  于 2023-03-11  发布在  其他
关注(0)|答案(1)|浏览(156)

我有一个 Dataframe 的形式:

name  0  1  2
0    A  4  2  1
1    B  2  3  4
2    C  1  3  2

这是我在真实的世界数据处理中对数据进行分组和汇总的结果。现在我想做的是展开(分解?)每行,使该行中的每个元素填充与列标题对应的多行(name除外),这样 Dataframe 就像这样结束:

name 0    1    2
------------------
A    0    1    2
A    0    1    nan
A    0    nan  nan
A    0    nan  nan
B    0    1    2
B    0    1    2
B    nan  1    2
B    nan  nan  2
C    0    1    2
C    nan  1    2
C    nan  1    nan

我已经尝试了很多关于df.iterrows()的东西,给一个空的 Dataframe 分配新的列,每一行的长度都是max,然后用nans填充,但是结果是错误百出,非常混乱。如果你们PandasMaven能看一看就太好了。谢谢你的建议!

可再现 Dataframe

import pandas as pd
df = pd.DataFrame({'name': ['A','B','C'], 0:[4,2,1], 1:[2,3,3], 2:[1,4,2]})
2vuwiymt

2vuwiymt1#

您可以重复您的行,直到每个原始行的最大数目,然后使用numpy broadcasting来屏蔽不需要的值:

# get list of columns other than name
cols = list(df.columns.difference(['name'], sort=False))

# repeat the rows to the max of each group
out = df.loc[df.index.repeat(df[cols].max(axis=1))]

# only keep the values < to the number of repeats
out[cols] = np.where(out[cols].gt(out.groupby('name').cumcount(), axis=0),
                     np.repeat([cols], len(out), axis=0), np.nan
                    )

输出:

name    0    1    2
0    A  0.0  1.0  2.0
0    A  0.0  1.0  NaN
0    A  0.0  NaN  NaN
0    A  0.0  NaN  NaN
1    B  0.0  1.0  2.0
1    B  0.0  1.0  2.0
1    B  NaN  1.0  2.0
1    B  NaN  NaN  2.0
2    C  0.0  1.0  2.0
2    C  NaN  1.0  2.0
2    C  NaN  1.0  NaN

中间体:

df.loc[df.index.repeat(df[cols].max(axis=1))]
  name  0  1  2
0    A  4  2  1
0    A  4  2  1
0    A  4  2  1
0    A  4  2  1
1    B  2  3  4
1    B  2  3  4
1    B  2  3  4
1    B  2  3  4
2    C  1  3  2
2    C  1  3  2
2    C  1  3  2

out[cols].gt(out.groupby('name').cumcount(), axis=0)
       0      1      2
0   True   True   True
0   True   True  False
0   True  False  False
0   True  False  False
1   True   True   True
1   True   True   True
1  False   True   True
1  False  False   True
2   True   True   True
2  False   True   True
2  False   True  False

相关问题