Python 在groupby函数后合并2个不同大小的数据帧

Python 在groupby函数后合并2个不同大小的数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我正在尝试将groupby筛选数据帧与原始数据帧关联起来。在执行groupby之后,我丢失了原始数据帧中的一些列。其想法是将其与各自的州和城市价值观联系起来。但是,当我尝试将数据帧向后关联时,数据帧会恢复到正常大小,有18行。我只需要原始数据帧到包含9行的最终数据帧的接口 原始数据帧: | COD |STATE| CITY | AZIM | SET|TEC| 0 |ALAAD_0001 |AL |MAC |0 |1 |4 | 1 |A

我正在尝试将groupby筛选数据帧与原始数据帧关联起来。在执行groupby之后,我丢失了原始数据帧中的一些列。其想法是将其与各自的州和城市价值观联系起来。但是,当我尝试将数据帧向后关联时,数据帧会恢复到正常大小,有18行。我只需要原始数据帧到包含9行的最终数据帧的接口

原始数据帧:

    |  COD      |STATE| CITY  |   AZIM | SET|TEC|
0   |ALAAD_0001 |AL   |MAC    |0       |1   |4  |
1   |ALAAD_0001 |AL   |MAC    |110     |2   |4  |
2   |ALAAD_0001 |AL   |ARA    |120     |2   |4  |
3   |ALAAD_0001 |AL   |MAC    |220     |3   |4  |
4   |ALAAD_0001 |AL   |MAC    |240     |3   |4  |
5   |BAPID_0001 |BA   |SAL    |20      |1   |2  |
6   |BAPID_0001 |BA   |SAL    |20      |1   |2  |
7   |BAPID_0001 |BA   |VIT    |100     |2   |2  |
8   |BAPID_0001 |BA   |SAL    |100     |2   |2  |
9   |BAPID_0001 |BA   |SAL    |210     |3   |2  |
10  |BAPID_0001 |BA   |SAL    |250     |3   |2  |
11  |BAPID_0001 |BA   |SAL    |250     |3   |2  |
12  |CEMBC_0003 |CE   |FOR    |90      |1   |4  |
13  |CEMBC_0003 |CE   |FOR    |80      |1   |4  |
14  |CEMBC_0003 |CE   |CAU    |160     |2   |4  |
15  |CEMBC_0003 |CE   |FOR    |160     |2   |4  |
16  |CEMBC_0003 |CE   |FOR    |170     |2   |4  |
17  |CEMBC_0003 |CE   |FOR    |280     |3   |4  |
分组后:

预期产出:


您可以将您的
cut_df
和原始
df
进行内部连接,以引入城市和州。尝试:

更新

下面连接键的行在
df
中不是唯一的,因此需要
删除重复项()

key=['COD','TEC','SET','AZIM']
result=pd.merge(df,df_cut,on=key,how='inner')。drop_duplicates()

gp-您的gropby数据帧

```python
or_drop = or.drop_duplicates(subset=['CITY', 'TEC', 'SET', 'AZIM'], keep='first')
expected = gp.merge(or['COD', 'STATE'], how=inner, on=['COD'])
expected = expected.merge(or_drop['TEC', 'SET', 'AZIM','CITY'], how=inner, on=['TEC', 'SET', 'AZIM])
或者-您的原始数据帧

```python
or_drop = or.drop_duplicates(subset=['CITY', 'TEC', 'SET', 'AZIM'], keep='first')
expected = gp.merge(or['COD', 'STATE'], how=inner, on=['COD'])
expected = expected.merge(or_drop['TEC', 'SET', 'AZIM','CITY'], how=inner, on=['TEC', 'SET', 'AZIM])
对不起,我没有检查它

使用++:

df_-cut

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

说明:

将模式最大值放置在每个组的末尾:

df.groupby(["COD", "TEC", "SET"])['AZIM'].transform(lambda x: x.mode().max())
通过将其与“AZIM”列进行比较来创建布尔索引,以查找mode max所在的索引:

df['AZIM'].eq(
    df.groupby(["COD", "TEC", "SET"])['AZIM']
        .transform(lambda x: x.mode().max())
)
这用于过滤
df

df[df['AZIM'].eq(
    df.groupby(["COD", "TEC", "SET"])['AZIM']
        .transform(lambda x: x.mode().max())
)]
最后,要删除重复项并清理索引,请执行以下操作:

df[df['AZIM'].eq(
    df.groupby(["COD", "TEC", "SET"])['AZIM']
        .transform(lambda x: x.mode().max())
)].drop_duplicates(["COD", "TEC", "SET"]).reset_index(drop=True)

不幸的是,它不起作用。输出为我提供了一个包含13行的数据帧。我要9排。啊,很抱歉。我没有意识到那些键的
df
中的行不是唯一的。您需要在合并之前或之后删除重复项()
。您是救生员!
0       0
1     120
2     120
3     240
4     240
5      20
6      20
7     100
8     100
9     250
10    250
11    250
12     90
13     90
14    160
15    160
16    160
17    280
Name: AZIM, dtype: int64
df['AZIM'].eq(
    df.groupby(["COD", "TEC", "SET"])['AZIM']
        .transform(lambda x: x.mode().max())
)
0      True
1     False
2      True
3     False
4      True
5      True
6      True
7      True
8      True
9     False
10     True
11     True
12     True
13    False
14     True
15     True
16    False
17     True
Name: AZIM, dtype: bool
df[df['AZIM'].eq(
    df.groupby(["COD", "TEC", "SET"])['AZIM']
        .transform(lambda x: x.mode().max())
)]
           COD STATE CITY  AZIM  SET  TEC
0   ALAAD_0001    AL  MAC     0    1    4
2   ALAAD_0001    AL  ARA   120    2    4
4   ALAAD_0001    AL  MAC   240    3    4
5   BAPID_0001    BA  SAL    20    1    2
6   BAPID_0001    BA  SAL    20    1    2
7   BAPID_0001    BA  VIT   100    2    2
8   BAPID_0001    BA  SAL   100    2    2
10  BAPID_0001    BA  SAL   250    3    2
11  BAPID_0001    BA  SAL   250    3    2
12  CEMBC_0003    CE  FOR    90    1    4
14  CEMBC_0003    CE  CAU   160    2    4
15  CEMBC_0003    CE  FOR   160    2    4
17  CEMBC_0003    CE  FOR   280    3    4
df[df['AZIM'].eq(
    df.groupby(["COD", "TEC", "SET"])['AZIM']
        .transform(lambda x: x.mode().max())
)].drop_duplicates(["COD", "TEC", "SET"]).reset_index(drop=True)
          COD STATE CITY  AZIM  SET  TEC
0  ALAAD_0001    AL  MAC     0    1    4
1  ALAAD_0001    AL  ARA   120    2    4
2  ALAAD_0001    AL  MAC   240    3    4
3  BAPID_0001    BA  SAL    20    1    2
4  BAPID_0001    BA  VIT   100    2    2
5  BAPID_0001    BA  SAL   250    3    2
6  CEMBC_0003    CE  FOR    90    1    4
7  CEMBC_0003    CE  CAU   160    2    4
8  CEMBC_0003    CE  FOR   280    3    4