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