Выберите из DataFrame последнее наблюдение из строк, принадлежащих к той же серии - PullRequest
0 голосов
/ 28 ноября 2018

Предположим, у меня есть DataFrame в Python, похожий на этот:

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

Мне известен этот ответ: выберите последнее наблюдение из продольных данных , но это в R.

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

попробуйте это,

print df.groupby('day',as_index=False)['value'].max()

Вывод:

       day  value
0   monday      5
1  tuesday      3
0 голосов
/ 28 ноября 2018
df[df.groupby(['day'])['value'].transform(max) == df['value']]

Выход:

     day    value
1   Monday   5
4   Tuesday  3
0 голосов
/ 28 ноября 2018

Добавить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...