#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