Разделение фрейма данных на меньшие фреймы данных на основе уникальных значений столбцов

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

это мой фрейм данных:

     Quantity     Code         Value       
0       1757     08951201     717.0
1       1100     08A85800       0.0
2       2500     08A85800       0.0
3        323     08951201       0.0
4        800     08A85800       0.0
 

и я хочу разделить это на более мелкие фреймы данных, созданные на основе столбца кода. (Например, этот фрейм должен быть разделен на df1 со всеми кодами 08951201 и df2 с 08A85800)

Редактировать: И я хотел бы иметь способ объединить их обратно в исходный фрейм данных в том же порядке после выполнения некоторых вычислений значений, которые я собираюсь выполнить.

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

1. зачем вам объединять их обратно? вы можете сохранить исходный…

2. вам следует прочитать документ split-apply-combine 😉

Ответ №1:

Как было предложено, вы можете использовать groupby() в своем фрейме данных для разделения по значениям одного имени столбца:

 import pandas as pd

cols = ['Quantity', 'Code', 'Value']
data = [[1757,     '08951201',     717.0],
 [1100,     '08A85800',       0.0],
 [2500,     '08A85800',       0.0],
 [323,    '08951201',      0.0],
 [800,    '08A85800',       0.0]]

df = pd.DataFrame(data, columns=cols)

groups =df.groupby(['Code'])
 

Затем вы можете восстановить индексы с помощью groups.indices , это вернет dict со значениями ‘Code’ в качестве ключей и индексом в качестве значений. Напоследок, если вы хотите получить каждый вложенный фрейм данных, который вы можете вызвать group_list = list(groups) . Я предлагаю выполнить работу в 2 этапа (сначала group by, затем call list), потому что таким образом вы можете вызывать другие методы через groupDataframe ( group )


Редактировать

Затем, если вам нужен конкретный фрейм данных, вы можете вызвать

  df_i = group_list[i][1]
 

group_list[i] является i-м элементом вложенного фрейма данных, но он содержит (group_val,group_df) кортеж. где group_val значение, связанное с этим новым фреймом данных ( '08951201' или '08A85800' ), и group_df является новым фреймом данных.

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

1. Боюсь, я не совсем понимаю. Мне нужны отдельные фреймы данных, но результатом этого является список (?)

2. group_list = list(groups) это список, затем вы можете вызвать group_list[0] , который является первым вложенным фреймом данных, group_list[1] вторым и так далее (в вашем примере у вас будет только 2, но если у вас больше кодов, то у вас будет больше)

3. print(type(group_list[1])) дает мне <class 'tuple'>

4. Извините, я виноват, вам нужно позвонить group_list[0][1] (первый индекс — это номер группы, второй — это порядок DF внутри кортежа). Первый элемент в кортеже — это связанное значение кода, второй элемент — фрейм данных

5. Извините, мне пришлось перейти в автономный режим. В любом случае, большое вам спасибо за ваше время. Это именно то, что мне было нужно, ответ 10/10.

Ответ №2:

Используйте groupby и применяйте свою пользовательскую функцию для обработки вашего вложенного фрейма данных:

 groups = df.groupby('Code')
print(list(groups))

# Output:
[('08951201',    Quantity      Code  Value
0      1757  08951201  717.0
3       323  08951201    0.0),

('08A85800',    Quantity      Code  Value
1      1100  08A85800    0.0
2      2500  08A85800    0.0
4       800  08A85800    0.0)]
 

Теперь предположим, что вы хотите с sum помощью Value :

 >>> df.groupby('Code')['Value'].sum()
Code
08951201    717.0
08A85800      0.0
Name: Value, dtype: float64