我有以下数据框:
| 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()
答案 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