首页 > 解决方案 > 从 DataFrame 中选择属于同一系列的行中的最后一个观察值

问题描述

假设我在 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'])

我想提取每一天的最后一个观察/元素,例如由 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

我知道这个答案:从纵向数据中选择最后一次观察,但它在 R 中。

标签: pythonpandasdataframe

解决方案


添加带有参数drop_duplicates的指定列,如有必要,还可以默认创建天数:daylastordered 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

推荐阅读