假设我在Python中有一个与此类似的DataFrame:
df = pd.DataFrame.from_dict({
'0': ['monday', 1],
'1': ['monday', 5],
'2': ['monday', 2],
'3': ['tuesday', 1],
'4': ['tuesday', 3]
}, orient='index', columns=['day', 'value'])
我想提取例如值列定义的每一天的最后观察/元素,所以:
df = df.sort_values(['day','value'])
如何在大型DataFrame上有效地做到这一点?一个理想效果的非常慢的例子是:
indices = []
for day in df['day'].unique():
indices.append(list(df[df['day'] == day].index)[-1])
df.loc[np.array(indices)]
哪种产量:
day value
1 monday 5
4 tuesday 3
我知道这个答案:select last observation from longitudinal data,但它在R中。
答案 0 :(得分:3)
添加drop_duplicates
,并用参数day
指定列last
,必要时还可以创建默认的天数排序ordered categorical
:
df = pd.DataFrame.from_dict({
'0': ['monday', 1, 4],
'1': ['monday', 5, 1],
'2': ['monday', 2, 0],
'3': ['tuesday', 1, 2],
'4': ['tuesday', 3, 3]
}, orient='index', columns=['day', 'value', 'value1'])
print (df)
day value value1
0 monday 1 4
1 monday 5 1
2 monday 2 0
3 tuesday 1 2
4 tuesday 3 3
categories=['monday','tuesday','wednesday','thursday','friday','saturday', 'sunday']
df['day'] = pd.Categorical(df['day'], categories=categories, ordered=True)
df = df.sort_values(['day','value']).drop_duplicates('day', keep='last')
print (df)
day value value1
1 monday 5 1
4 tuesday 3 3
答案 1 :(得分:1)
尝试一下
print df.groupby('day',as_index=False)['value'].max()
输出:
day value
0 monday 5
1 tuesday 3
答案 2 :(得分:1)
df[df.groupby(['day'])['value'].transform(max) == df['value']]
输出:
day value
1 Monday 5
4 Tuesday 3