Панды создают несколько фреймов данных на основе дублированного индекса фрейма данных - PullRequest
4 голосов
/ 23 мая 2019

Если у меня есть фрейм данных с дубликатами в индексе, как бы я создал набор фреймов данных без дубликатов в индексе?

Точнее, с учетом кадра данных:

   a  b
1  1  6
1  2  7
2  3  8
2  4  9
2  5  0

Я хотел бы получить в качестве вывода список данных:

   a  b
1  1  6
2  3  8


   a  b
1  2  7
2  4  9


   a  b
2  5  0

Это должно быть масштабируемо до необходимого количества фреймов данных в зависимости от количества дубликатов.

Ответы [ 3 ]

2 голосов
/ 23 мая 2019

Используйте GroupBy.cumcount для пользовательских групп, а затем преобразуйте группы в словари:

df = dict(tuple(df.groupby(df.groupby(level=0).cumcount())))
print (df)
{0:    a  b
1  1  6
2  3  8, 1:    a  b
1  2  7
2  4  9, 2:    a  b
2  5  0}

print (dfs[0])
   a  b
1  1  6
2  3  8

Или преобразовать в список фреймов данных:

dfs = [x for i, x in df.groupby(df.groupby(level=0).cumcount())]
print (dfs)
[   a  b
1  1  6
2  3  8,    a  b
1  2  7
2  4  9,    a  b
2  5  0]
2 голосов
/ 23 мая 2019
df=df.reset_index()
dfs=[]
while not df.empty:
    dfs.append(df[~df.duplicated('index',keep='first')].set_index('index'))
    df=df[df.duplicated('index',keep='first')]

#dfs will have all your dataframes
1 голос
/ 23 мая 2019

Другой подход заключается в использовании pd.DataFrame.groupby.nth:

import numpy as np

g = df.groupby(df.index)
cnt = np.bincount(df.index).max()
dfs = [g.nth(i) for i in range(cnt)]

Выход:

[  a  b
1  1  6
2  3  8,    
   a  b
1  2  7
2  4  9,
   a  b
2  5  0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...