熊猫:根据另一栏的最大或最小功能

时间:2020-08-08 01:18:31

标签: python pandas pandas-groupby

我有以下数据框:

| Date       | Word    | Numb |
|------------|---------|------|
| 2020/01/01 | ab      | 12   |
| 2020/01/01 | bc      | 24   |
| 2020/01/01 | ab      | -12  |
| 2020/01/01 | bc      | 34   |
| 2020/01/02 | ab      |  3   |
| 2020/01/02 | bc      | 123  |
| 2020/01/02 | ab      | -8   |
| 2020/01/02 | bc      | 12   |

我想创建一个新的数据框,如果Word列中的字符串为 ab ,则在Numb列中获得最小值;如果字符串为 bc < / strong>。例如,具有上述数据框的结果应为:

|            |      | Numb |
| Date       | Word |      |
|------------|------|------|
| 2020/01/01 | ab   | -12  |
|            | bc   | 34   |
| 2020/01/02 | ab   | -8   |
|            | bc   | 123  |

我正在使用以下groupby函数,但是在所有情况下,它只会产生一个带有最小值的数据框:

ans=df.groupby(['Date','Element']).min()

5 个答案:

答案 0 :(得分:3)

我们可以与groupby链接,并将结果传递到np.where

s=df.groupby(['Date','Word']).Numb.agg(['min','max'])
s['number']=np.where(s.index.get_level_values(1)=='ab',s.min(1),s.max(1))
s
Out[38]: 
                 min  max  number
Date       Word                  
2020/01/01 ab    -12   12     -12
           bc     24   34      34
2020/01/02 ab     -8    3      -8
           bc     12  123     123

答案 1 :(得分:1)

您可以将pd.concat与每个选定的Word数据帧一起使用,然后将sort_values一次使用True(首先获取最小值),一次使用False(首先获取最大值),然后使用{{ 1}},并保留第一个。

drop_duplicates

答案 2 :(得分:1)

IIUC,

groups = df.groupby(['Date','Word'], as_index=False)['Numb']
new_df = groups.min().where(lambda x: x['Word'].eq('ab'), groups.max())
print(new_df)

# s = new_df.set_index(['Date','Word']) #for expected output

输出

         Date Word  Numb
0  2020/01/01   ab   -12
1  2020/01/01   bc    34
2  2020/01/02   ab    -8
3  2020/01/02   bc   123

答案 3 :(得分:1)

您可以进行一些精美的重塑,分组和重塑:

dfs = df.set_index(['Date','Word'], append=True)['Numb'].unstack()
dfg = dfs.groupby('Date').agg(ab=('ab','min'), bc=('bc','max'))
dfg.stack().to_frame(name='Numb').rename_axis(['Date', 'Word'])

输出:

                   Numb
Date        Word       
2020/01/01  ab    -12.0
            bc     34.0
2020/01/02  ab     -8.0
            bc    123.0

答案 4 :(得分:1)

您可以在汇总后堆叠结果:

df.groupby("Date").agg(["min", "max"]).stack().droplevel(-1)

         Word   Numb
Date        
2020/01/01  ab  -12
2020/01/01  bc  34
2020/01/02  ab  -8
2020/01/02  bc  123