Сортировать строки в Pandas DataFrame на основе агрегированного количества и получить одну строку случайным образом - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть Pandas DataFrame с такими столбцами:

col1 col2 col3 col4 col5

a a1 foo1 foo2 foo3

b b1 foo4 foo5 foo6

c c1 foo7 foo8 foo9

a a2 foo10 foo11 foo12

a a3 foo13 foo14 foo15

b b2 foo16 foo17 foo18

Я хотел бы отсортировать строки (все строки) этого кадра данных на основе частоты убывания значений в col1, а затем для других столбцов в строке получить одну из строк, которые имеют это значение в своем столбце ( аналогично группировке SQL). Как я могу сделать это в Пандах? Я считаю, что это некоторая комбинация groupby и sort_values, но я не совсем уверен, как это сделать.

Для приведенного выше примера a является наиболее частым значением в col1, за которым следуют b и c. Поэтому я хотел бы, чтобы первая строка результирующего кадра данных была одной из строк со значением col1, равным a. Следующая строка должна быть одной из двух строк со значением b. И последний ряд - единственный ряд, имеющий значение c.

Так что это один ответ:

col1 col2 col3 col4 col5

a a1 foo1 foo2 foo3

b b1 foo4 foo5 foo6

c c1 foo7 foo8 foo9

а вот так:

col1 col2 col3 col4 col5

a a3 foo13 foo14 foo15

b b1 foo4 foo5 foo6

c c1 foo7 foo8 foo9

А вот этот:

col1 col2 col3 col4 col5

a a2 foo10 foo11 foo12

b b2 foo16 foo17 foo18

c c1 foo7 foo8 foo9

В результате все это хорошо. Чтобы быть более понятным, смешивание значений из разных строк не допускается. Строка должна быть возвращена в точности как есть.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вот как вы могли бы сделать это:

1) Создайте серию помощников, используя Series.value_counts для получения заказа

2) Индексируйте свой оригинальный df с помощью этой вспомогательной серии и удаляйте дублирующиеся col1 значения.

s = df.col1.value_counts()
df.set_index('col1').loc[s.index].reset_index().drop_duplicates('col1')

или в одну строку:

df2 = (df.set_index('col1')
       .loc[df.col1.value_counts().index]
       .reset_index()
       .drop_duplicates('col1'))

[выход]

    col1    col2    col3    col4    col5
0   a       a1      foo1    foo2    foo3
3   b       b1      foo4    foo5    foo6
5   c       c1      foo7    foo8    foo9
0 голосов
/ 05 сентября 2018

Вот довольно простой способ сделать это, сначала отсортировав по столбцу col1, а затем отбросив дубликаты:

import pandas as pd
df = pd.read_csv('funky.csv')
df.sort_values('col1', ascending=True, inplace=True)
df

вывод для части 1:

  col1 col2   col3   col4   col5
0    a   a1   foo1   foo2   foo3
3    a   a2  foo10  foo11  foo12
4    a   a3  foo13  foo14  foo15
1    b   b1   foo4   foo5   foo6
5    b   b2  foo16  foo17  foo18
2    c   c1   foo7   foo8   foo9

, затем просто отбросьте дубликаты в столбце 1:

df2 = df.drop_duplicates(['col1'])
df2

выход: * +1010 *

  col1 col2  col3  col4  col5
0    a   a1  foo1  foo2  foo3
1    b   b1  foo4  foo5  foo6
2    c   c1  foo7  foo8  foo9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...