Дублирующая строка с низкой частотой встречаемости в кадре данных панд - PullRequest
0 голосов
/ 15 ноября 2018

В следующем наборе данных, каков наилучший способ дублировать строку со счетом groupby (['Type']) <3 до 3. df - это вход, а df1 - мой желаемый результат.Вы видите, что строка 3 из df была продублирована 2 раза в конце.Это только пример колоды.реальные данные имеют приблизительно 20 миллионов строк и 400 тыс. уникальных типов, таким образом, метод, который делает это эффективно, является желательным.</p>

>>> df
  Type  Val
0    a    1
1    a    2
2    a    3
3    b    1
4    c    3
5    c    2
6    c    1
>>> df1
  Type  Val
0    a    1
1    a    2
2    a    3
3    b    1
4    c    3
5    c    2
6    c    1
7    b    1
8    b    1

Думал об использовании чего-то подобного следующему, но не знаю, как лучше написать функционал.

df.groupby('Type').apply(func)

Заранее спасибо.

1 Ответ

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

Использование value_counts с map и repeat:

counts = df.Type.value_counts()
repeat_map = 3 - counts[counts < 3]
df['repeat_num'] = df.Type.map(repeat_map).fillna(0,downcast='infer')
df = df.append(df.set_index('Type')['Val'].repeat(df['repeat_num']).reset_index(), 
               sort=False, ignore_index=True)[['Type','Val']]

print(df)

  Type  Val
0    a    1
1    a    2
2    a    3
3    b    1
4    c    3
5    c    2
6    c    1
7    b    1
8    b    1

Примечание: sort=False для append присутствует в pandas>=0.23.0, удалить при использовании более низкой версии.

РЕДАКТИРОВАТЬ: Если данные содержат несколько столбцов val, тогда все столбцы столбцов сделать индексами, кроме одногостолбец и повторите, а затем reset_index как:

df = df.append(df.set_index(['Type','Val_1','Val_2'])['Val'].repeat(df['repeat_num']).reset_index(), 
               sort=False, ignore_index=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...