Как включить совпадающие значения при использовании sort_values ​​+ head () - PullRequest
1 голос
/ 10 февраля 2020

У меня есть df:

       Date Symbol Person
0   2019 Q3      A    Bob
1   2019 Q3      A    Jon
2   2019 Q3      B    Rob
3   2019 Q3      B    Ron
4   2019 Q3      C    Jay
5   2019 Q3      C    Ray
6   2019 Q3      D    Fay
7   2019 Q2      A    Bob
8   2019 Q2      A    Jon
9   2019 Q2      B    Rob
10  2019 Q2      B    Ron
11  2019 Q2      C    Jay
12  2019 Q2      C    Ray
13  2019 Q2      D    Fay
14  2019 Q2      D    Bre
15  2019 Q2      E    Jon
16  2019 Q2      F    Ron

, где я пытаюсь найти два верхних Symbols за квартал по количеству. Но, как вы можете видеть, иногда существует более двух Symbols с одинаковым значением счетчика для данного Date (например, символы A, B, и C в 2019 Q3 и символы A, B, C и D в 2019 Q2.

Когда я сделаю:

df['Count'] = df.groupby(['Date', 'Symbol'])['Person'].transform('nunique')
df = df[['Date', 'Symbol', 'Count']]
df.drop_duplicates(subset=None, keep="first", inplace=True)
df = df.sort_values('Count', ascending=False).groupby('Date').head(2).sort_index()

Мой вывод включает только первые два:

   Date Symbol  Count
2019 Q3      A      2
2019 Q3      B      2
2019 Q2      A      2
2019 Q2      B      2

Но как я могу получить его так, чтобы все связанные counts экземпляры тоже были включены, чтобы он выглядел так:

   Date Symbol  Count
2019 Q3      A      2
2019 Q3      B      2
2019 Q3      C      2
2019 Q2      A      2
2019 Q2      B      2
2019 Q2      C      2
2019 Q2      D      2

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Мы можем GroupBy и получить nunique s (без transforming) и отфильтровать, где Count больше или равно второму значению в столбце Count:

df.sort_values(['Date', 'Symbol'], inplace=True)
g = df.groupby(['Date', 'Symbol']).Person.nunique().rename('Count')
g[g >= g.groupby(level=0).transform('nth', 1)].reset_index()

    Date    Symbol  Count
0  2019Q2      A      2
1  2019Q2      B      2
2  2019Q2      C      2
3  2019Q2      D      2
4  2019Q3      A      2
5  2019Q3      B      2
6  2019Q3      C      2

Это работает, потому что, поскольку данные отсортированы, выбор всех значений, больших или равных второму значению в столбце Count, гарантирует, что мы всегда будем включать либо:

  • Два наивысших значения ( в случае, если второе отличается)
  • Все числа, которые равны первому, в случае, если второе такое же, как первое
0 голосов
/ 14 февраля 2020

Это сработало для меня:

    new_df = pd.DataFrame()
    for q in df.Date.unique():
        f = df.loc[df.Date == q]
        f = f.groupby(['Date', 'Symbol']).size().nlargest(n,keep='all').to_frame().reset_index()
        f.columns = ['Date', 'Symbol', 'Count']
        new_df = pd.concat([new_df, f])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...