Как создать несколько фреймов данных без повторения из одного фрейма данных? - PullRequest
1 голос
/ 18 октября 2019

У меня есть датафрейм, как показано ниже

df = pd.DataFrame({
'subject_id':[1,1,1,1,2,2,2,2,3,3,4,4,4,4,4],
'readings' : ['READ_1','READ_2','READ_1','READ_3','READ_1','READ_5','READ_6','READ_8','READ_10','READ_12','READ_11','READ_14','READ_09','READ_08','READ_07'],
 'val' :[5,6,7,11,5,7,16,12,13,56,32,13,45,43,46],
 })

Я хотел бы создать из этого несколько фреймов данных (df1, df2). В реальном времени это не должно быть два. Это может быть 10 или 20 в зависимости от размера моих данных. Я спрашиваю об этом, потому что намереваюсь выполнить параллельную обработку . Я разделю свой один огромный df на несколько маленьких фреймов данных и выполню параллельную обработку

, например df1 должен содержать все записи 2 (двух) субъектов, а df2 должен содержать все записи оставшихся 2 субъектов

Пробовал это, но это не правильно

grouped = df.groupby('subject_id')
df1 = grouped.filter(lambda x: x['subject_id']== 2)

Я ожидаю, что мой вывод будет таким

df1 - содержит все записи 2предметы. В режиме реального времени я хочу выбрать 100 предметов и хотел бы, чтобы все их записи были в одном кадре данных

enter image description here

df2 -содержит все записи по 2 предметам. Но в реальном времени я хочу выбрать 100 субъектов и иметь все их записи в одном кадре данных

enter image description here

Как вы можете видеть, существует четкое разделение данныхоснованный на предметах и ​​отсутствие присутствия данных субъекта в нескольких кадрах данных. Как subject_id = 1 has data only in df1

обновленное сообщение

enter image description here

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Создать список фреймов данных с groupby и

, если subject_id - это числа от 1 до N:

dfs = [x for _,x in df.groupby((df['subject_id'] - 1) // N)]

Общее решение, работающее с любыми значениями в subject_id - например, строки:

использовать factorize для целого числа массива, деленного на число subject_id:

N = 2

print (pd.factorize(df['subject_id'])[0])
[0 0 0 0 1 1 1 1 2 2 3 3 3 3 3]

print (pd.factorize(df['subject_id'])[0] // N )
[0 0 0 0 0 0 0 0 1 1 1 1 1 1 1]
dfs = [x for _,x in df.groupby(pd.factorize(df['subject_id'])[0] // N)]
print (dfs)
[   subject_id readings  val
0           1   READ_1    5
1           1   READ_2    6
2           1   READ_1    7
3           1   READ_3   11
4           2   READ_1    5
5           2   READ_5    7
6           2   READ_6   16
7           2   READ_8   12,     subject_id readings  val
8            3  READ_10   13
9            3  READ_12   56
10           4  READ_11   32
11           4  READ_14   13
12           4  READ_09   45
13           4  READ_08   43
14           4  READ_07   46]

print (dfs[0])
   subject_id readings  val
0           1   READ_1    5
1           1   READ_2    6
2           1   READ_1    7
3           1   READ_3   11
4           2   READ_1    5
5           2   READ_5    7
6           2   READ_6   16
7           2   READ_8   12

1 голос
/ 18 октября 2019

Мне кажется, вам нужно pd.cut для создания групп:

n=2
groups=pd.cut(df['subject_id'],n)
for i , group in df.groupby(groups):
    print(group)

   subject_id readings  val
0           1   READ_1    5
1           1   READ_2    6
2           1   READ_1    7
3           1   READ_3   11
4           2   READ_1    5
5           2   READ_5    7
6           2   READ_6   16
7           2   READ_8   12
    subject_id readings  val
8            3  READ_10   13
9            3  READ_12   56
10           4  READ_11   32
11           4  READ_14   13
12           4  READ_09   45
13           4  READ_08   43
14           4  READ_07   46

Если вы хотите, вы можете сохранить в списке:

#savig in a list
df_list=[group for i , group in df.groupby(groups)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...