为了账号安全,请及时绑定邮箱和手机立即绑定

将 groupby 数据框重塑为固定尺寸

将 groupby 数据框重塑为固定尺寸

犯罪嫌疑人X 2022-01-18 21:12:59
我有带有以下数据的数据框 df 。A    B    C    D1    1    3    11    2    9    81    3    3    92    1    2    92    2    1    42    3    9    52    4    6    43    1    4    13    2    0    44    1    2    65    1    2    45    2    8    3grp = df.groupby('A')接下来,我想让所有数据帧 df 组在 A 列上分组,使其具有相同的行数。截断多余的行或填充 0 行。对于上述数据,我想让所有组都有 3 行。我需要以下结果。A    B    C    D1    1    3    11    2    9    81    3    3    92    1    2    92    2    1    42    3    9    53    1    4    13    2    0    43    0    0    04    1    2    64    0    0    04    0    0    05    1    2    45    2    8    35    0    0    0同样,我可能想在多个列上进行分组,例如 grp = df.groupby(['A','B'])
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

用于带有byGroupBy.cumcount的计数器列:DataFrame.reindexMultiIndex.from_product


df['g'] = df.groupby('A').cumcount()

mux = pd.MultiIndex.from_product([df['A'].unique(), range(3)], names=('A','g'))


df = (df.set_index(['A','g'])

        .reindex(mux, fill_value=0)

        .reset_index(level=1, drop=True)

        .reset_index())

print (df)

    A  B  C  D

0   1  1  3  1

1   1  2  9  8

2   1  3  3  9

3   2  1  2  9

4   2  2  1  4

5   2  3  9  5

6   3  1  4  1

7   3  2  0  4

8   3  0  0  0

9   4  1  2  6

10  4  0  0  0

11  4  0  0  0

12  5  1  2  4

13  5  2  8  3

14  5  0  0  0

另一种DataFrame.merge使用左连接和助手的解决方案DataFrame:


from  itertools import product


df['g'] = df.groupby('A').cumcount()

df1 = pd.DataFrame(list(product(df['A'].unique(), range(3))), columns=['A','g'])


df = df1.merge(df, how='left').fillna(0).astype(int).drop('g', axis=1)

print (df)

    A  B  C  D

0   1  1  3  1

1   1  2  9  8

2   1  3  3  9

3   2  1  2  9

4   2  2  1  4

5   2  3  9  5

6   3  1  4  1

7   3  2  0  4

8   3  0  0  0

9   4  1  2  6

10  4  0  0  0

11  4  0  0  0

12  5  1  2  4

13  5  2  8  3

14  5  0  0  0

编辑:


df['g'] = df.groupby(['A','B']).cumcount()


mux = pd.MultiIndex.from_product([df['A'].unique(), 

                                  df['B'].unique(), 

                                  range(3)], names=('A','B','g'))

df = (df.set_index(['A','B','g'])

        .reindex(mux, fill_value=0)

        .reset_index(level=2, drop=True)

        .reset_index())

print (df.head(10))

   A  B  C  D

0  1  1  3  1

1  1  1  0  0

2  1  1  0  0

3  1  2  9  8

4  1  2  0  0

5  1  2  0  0

6  1  3  3  9

7  1  3  0  0

8  1  3  0  0

9  1  4  0  0

from  itertools import product


df['g'] = df.groupby(['A','B']).cumcount()

df1 = pd.DataFrame(list(product(df['A'].unique(),

                                df['B'].unique(), 

                                range(3))), columns=['A','B','g'])


df = df1.merge(df, how='left').fillna(0).astype(int).drop('g', axis=1)


查看完整回答
反对 回复 2022-01-18
  • 1 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信