首页 > 解决方案 > 在 groupby 函数之后合并两个不同大小的数据帧

问题描述

我正在尝试将 groupby 过滤数据帧与原始数据帧相关联。完成 groupby 后,我丢失了原始数据框中的一些列。我们的想法是将其与各自的 STATE 和 CITY 值相关联。但是当我尝试重新关联时,数据框会恢复到正常大小,有 17 行。我只想要原始数据帧的接口到包含 9 行的最终数据帧。

原始数据框:

    |  COD      |STATE| CITY  |   AZIM | SET|TEC|
0   |ALAAD_0001 |AL   |MAC    |0       |1   |4  |
1   |ALAAD_0001 |AL   |MAC    |120     |2   |4  |
2   |ALAAD_0001 |AL   |MAC    |120     |2   |4  |
3   |ALAAD_0001 |AL   |MAC    |240     |3   |4  |
4   |BAPID_0001 |BA   |SAL    |20      |1   |2  |
5   |BAPID_0001 |BA   |SAL    |20      |1   |2  |
7   |BAPID_0001 |BA   |SAL    |100     |2   |2  |
8   |BAPID_0001 |BA   |SAL    |210     |3   |2  |
9   |BAPID_0001 |BA   |SAL    |250     |3   |2  |
10  |BAPID_0001 |BA   |SAL    |250     |3   |2  |
11  |CEMBC_0003 |CE   |FOR    |90      |1   |4  |
12  |CEMBC_0003 |CE   |FOR    |80      |1   |4  |
13  |CEMBC_0003 |CE   |FOR    |160     |2   |4  |
14  |CEMBC_0003 |CE   |FOR    |160     |2   |4  |
15  |CEMBC_0003 |CE   |FOR    |170     |2   |4  |
16  |CEMBC_0003 |CE   |FOR    |280     |3   |4  |

分组后:

    | COD       |TEC     |SET |AZIM|
0   |ALAAD_0001 |4       |1   |0   |
1   |ALAAD_0001 |4       |2   |120 | 
2   |ALAAD_0001 |4       |3   |240 | 
3   |BAPID_0001 |2       |1   |20  | 
4   |BAPID_0001 |2       |2   |100 | 
5   |BAPID_0001 |2       |3   |250 |
6   |CEMBC_0003 |4       |1   |90  | 
7   |CEMBC_0003 |4       |2   |160 | 
8   |CEMBC_0003 |4       |3   |280 | 
df_cut = (
    df.groupby(["COD","TEC","SET"])
    .AZIM
    .agg(lambda x: pd.Series.mode(x).max())
    .reset_index()
)

预期输出:

    |   COD     | TEC    | SET |AZIM  | STATE | CITY |
0   |ALAAD_0001 |4       |1    |0     | AL    |MAC   |
1   |ALAAD_0001 |4       |2    |120   | AL    |MAC   |
2   |ALAAD_0001 |4       |3    |240   | AL    |MAC   |
3   |BAPID_0001 |2       |1    |20    | BA    |SAL   |
4   |BAPID_0001 |2       |2    |100   | BA    |SAL   |
5   |BAPID_0001 |2       |3    |250   | BA    |SAL   |
6   |CEMBC_0003 |4       |1    |90    | CE    |FOR   |
7   |CEMBC_0003 |4       |2    |160   | CE    |FOR   |
8   |CEMBC_0003 |4       |3    |280   | CE    |FOR   |

标签: pythonpandasdataframe

解决方案


我们使用内部连接来合并两个数据帧,因为原始 df 在合并键上有重复,所以它返回重复值。drop_duplicates()派上用场来解决这个问题。

代码

df_cut.merge(df.drop_duplicates(), on=["COD","TEC","SET", "AZIM"])

输出

    COD        TEC  SET AZIM    STATE   CITY
0   ALAAD_0001  4   1   0       AL      MAC
1   ALAAD_0001  4   2   120     AL      MAC
2   ALAAD_0001  4   3   240     AL      MAC
3   BAPID_0001  2   1   20      BA      SAL
4   BAPID_0001  2   2   100     BA      SAL
5   BAPID_0001  2   3   250     BA      SAL
6   CEMBC_0003  4   1   90      CE      FOR
7   CEMBC_0003  4   2   160     CE      FOR
8   CEMBC_0003  4   3   280     CE      FOR

推荐阅读