Как создать n фреймов данных с одинаковой структурой в соответствии со значением?

#python #pandas

Вопрос:

Мой исходный кадр данных выглядит следующим образом:

Имя ID
тест 1
тест 2
тест 2
тест 3
тест 4
тест 5
тест 6
тест 7
тест 8
тест 9
тест 9
тест 10
тест 11
тест 12
тест 13

Теперь я хочу создать три подкадра (или список кадров данных), которые содержат строки со следующими идентификаторами:

df[0]: 1, 4, 7, 10, 13

df[1]: 2, 5, 8, 11

df[2]: 3, 6, 9, 12

Таким образом, на самом деле df[1] приводит к следующему:

Имя ID
тест 2
тест 2
тест 5
тест 8
тест 11

Я попробовал сделать это с помощью цикла и «добавить», но я читаю это довольно медленно, если у вас много строк. Я действительно не уверен, как сделать это приятным и эффективным способом с пандами.

Комментарии:

1. Вы хотите list получить фреймы данных в качестве выходных данных?

2. Да, я хочу list , чтобы в качестве вывода был один из фреймов данных.

Ответ №1:

Учитывая шаблон, кажется, что вы хотите сгруппироваться на основе результата df.id % 3 . В этом случае, вот векторизованный подход, использующий DataFrame.groupby

 groups = [g for k, g in df.groupby(df.id % 3, sort=False)]  

Ввод

 gt;gt;gt; df   name id 0 test 1 1 test 2 2 test 2 3 test 3 4 test 4 5 test 5 6 test 6 7 test 7 8 test 8 9 test 9 10 test 9 11 test 10 12 test 11 13 test 12 14 test 13  name id 0 test 1 4 test 4 7 test 7 11 test 10 14 test 13   

Выход

 gt;gt;gt; groups[0]   name id 0 test 1 4 test 4 7 test 7 11 test 10 14 test 13   gt;gt;gt; groups[1]   name id 1 test 2 2 test 2 5 test 5 8 test 8 12 test 11   gt;gt;gt; groups[2]   name id 3 test 3 6 test 6 9 test 9 10 test 9 13 test 12   

Ответ №2:

df-это ваш исходный кадр данных:

 dfs = [] a = [[1, 4, 7, 10, 13],[2, 5, 8, 11],[3, 6, 9, 12]]  for i in a:  dfs.append(df.loc[df['id'].isin(i)])   print(dfs[0]) print(dfs[1]) print(dfs[2])  

выход:

 name id 0 test 1 4 test 4 7 test 7 11 test 10 14 test 13  name id 1 test 2 2 test 2 5 test 5 8 test 8 12 test 11  name id 3 test 3 6 test 6 9 test 9 10 test 9 13 test 12