Pandas: 重采样分组数据框列,得到对应于最大值的离散特征
Pandas: Resample grouped dataframe column, get discrete feature that corresponds to max value
这与我之前问过的一个问题类似,但差异很大,因为解决方案在数据分组时不起作用:
给定一些数据:
import pandas as pd
import numpy as np
import datetime
data = {'group':['a', 'a', 'a','b','a', 'b'],
'value': [1,2,3,4,3,5], 'names': ['joe', 'bob', 'greg','joe', 'bob', 'greg'],
'dates': ['2015-01-01', '2015-01-02', '2015-01-03', '2015-01-03', '2015-01-04', '2015-01-04']}
df = pd.DataFrame(data=data, columns=["group", "value", "names"],
index=pd.to_datetime(data['dates']))
给出:
group value names
2015-01-01 a 1 joe
2015-01-02 a 2 bob
2015-01-03 a 3 greg
2015-01-03 b 4 joe
2015-01-04 a 3 bob
2015-01-04 b 5 greg
我希望获得:
group value names
2015-01-01 a 2 bob
2015-01-03 a 3 bob
2015-01-03 b 5 greg
于是将数据分组,按2天('2D')重采样,然后采集最大'value'对应的名字
我尝试了以下错误:
(df.groupby('group').resample('2D')[['value']].idxmax()
.assign(names=lambda x: df.loc[x.value]['names'].values,
value=lambda x: df.loc[x.value]['value'].values)
)
分组后可以使用apply
对值进行排序,按值命名列,然后取第一行。
g = df.groupby(['group', pd.Grouper(freq='2D')])[['value', 'names']]
g.apply(lambda x: x.sort_values(['value', 'names'], ascending=[False, True]).iloc[0])\
.reset_index('group')
group value names
2015-01-01 a 2 bob
2015-01-03 a 3 bob
2015-01-03 b 5 greg
这与使用重采样相同
g = df.groupby(['group'])[['value', 'names']]
g.resample('2D').apply(lambda x: x.sort_values(['value', 'names'], ascending=[False, True]).iloc[0])\
.reset_index('group')
这与我之前问过的一个问题类似,但差异很大,因为解决方案在数据分组时不起作用:
给定一些数据:
import pandas as pd
import numpy as np
import datetime
data = {'group':['a', 'a', 'a','b','a', 'b'],
'value': [1,2,3,4,3,5], 'names': ['joe', 'bob', 'greg','joe', 'bob', 'greg'],
'dates': ['2015-01-01', '2015-01-02', '2015-01-03', '2015-01-03', '2015-01-04', '2015-01-04']}
df = pd.DataFrame(data=data, columns=["group", "value", "names"],
index=pd.to_datetime(data['dates']))
给出:
group value names
2015-01-01 a 1 joe
2015-01-02 a 2 bob
2015-01-03 a 3 greg
2015-01-03 b 4 joe
2015-01-04 a 3 bob
2015-01-04 b 5 greg
我希望获得:
group value names
2015-01-01 a 2 bob
2015-01-03 a 3 bob
2015-01-03 b 5 greg
于是将数据分组,按2天('2D')重采样,然后采集最大'value'对应的名字 我尝试了以下错误:
(df.groupby('group').resample('2D')[['value']].idxmax()
.assign(names=lambda x: df.loc[x.value]['names'].values,
value=lambda x: df.loc[x.value]['value'].values)
)
分组后可以使用apply
对值进行排序,按值命名列,然后取第一行。
g = df.groupby(['group', pd.Grouper(freq='2D')])[['value', 'names']]
g.apply(lambda x: x.sort_values(['value', 'names'], ascending=[False, True]).iloc[0])\
.reset_index('group')
group value names
2015-01-01 a 2 bob
2015-01-03 a 3 bob
2015-01-03 b 5 greg
这与使用重采样相同
g = df.groupby(['group'])[['value', 'names']]
g.resample('2D').apply(lambda x: x.sort_values(['value', 'names'], ascending=[False, True]).iloc[0])\
.reset_index('group')