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

我有带有以下数据的数据框 df 。


A    B    C    D

1    1    3    1

1    2    9    8

1    3    3    9

2    1    2    9

2    2    1    4

2    3    9    5

2    4    6    4

3    1    4    1

3    2    0    4

4    1    2    6

5    1    2    4

5    2    8    3


grp = df.groupby('A')

接下来,我想让所有数据帧 df 组在 A 列上分组,使其具有相同的行数。截断多余的行或填充 0 行。对于上述数据,我想让所有组都有 3 行。我需要以下结果。


A    B    C    D

1    1    3    1

1    2    9    8

1    3    3    9

2    1    2    9

2    2    1    4

2    3    9    5

3    1    4    1

3    2    0    4

3    0    0    0

4    1    2    6

4    0    0    0

4    0    0    0

5    1    2    4

5    2    8    3

5    0    0    0

同样,我可能想在多个列上进行分组,例如 grp = df.groupby(['A','B'])


犯罪嫌疑人X
浏览 131回答 1
1回答

慕码人2483693

用于带有byGroupBy.cumcount的计数器列:DataFrame.reindexMultiIndex.from_productdf['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  D0   1  1  3  11   1  2  9  82   1  3  3  93   2  1  2  94   2  2  1  45   2  3  9  56   3  1  4  17   3  2  0  48   3  0  0  09   4  1  2  610  4  0  0  011  4  0  0  012  5  1  2  413  5  2  8  314  5  0  0  0另一种DataFrame.merge使用左连接和助手的解决方案DataFrame:from  itertools import productdf['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  D0   1  1  3  11   1  2  9  82   1  3  3  93   2  1  2  94   2  2  1  45   2  3  9  56   3  1  4  17   3  2  0  48   3  0  0  09   4  1  2  610  4  0  0  011  4  0  0  012  5  1  2  413  5  2  8  314  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  D0  1  1  3  11  1  1  0  02  1  1  0  03  1  2  9  84  1  2  0  05  1  2  0  06  1  3  3  97  1  3  0  08  1  3  0  09  1  4  0  0from  itertools import productdf['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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python