#python #pandas #dataframe #pandas-groupby
#python #pandas #фрейм данных #pandas-groupby
Вопрос:
Предположим, у меня есть фрейм данных df
с тремя столбцами
df=
id date value
A 02-04-2000 3
A 03-04-2000 8
B 04-04-2000 12
B 02-04-2000 7
C 03-04-2000 5
C 04-04-2000 2
Меня интересует группировка данных на основе df['id']
столбца и сохранение значений в переменных new
. Он new
должен хранить значения таким образом, чтобы при вызове new[1]
он возвращал элементы, соответствующие id = A
выходу из id
столбца, а new[2] должен возвращать элементы, соответствующие id = B
и так далее.
пример вывода:
new[1]=
date value
02-04-2000 3
03-04-2000 8
new[2]=
date value
04-04-2000 12
02-04-2000 7
Ответ №1:
Для всех решений используется DataFrame.groupby
с удалением id
столбца by DataFrame.drop
.
Если возможно, индексирование по 0, 1,...
и вывод DataFrame
— это список:
new = [g.drop('id', axis=1) for _, g in df.groupby('id')]
print (new[0])
date value
0 02-04-2000 3
1 03-04-2000 8
Если вывод представляет собой словарь DataFrame
s, здесь создаются последовательные группы:
new = {k: g.drop('id', axis=1)
for k, g in df.groupby(df['id'].ne(df['id'].shift()).cumsum())}
print (new[1])
date value
0 02-04-2000 3
1 03-04-2000 8
Аналогичное решение (без последовательных групп):
new1 = {k: g.drop('id', axis=1) for k, g in df.groupby('id')}
print (new1['A'])
date value
0 02-04-2000 3
1 03-04-2000 8
Группировка по смежной группе, которую я пытаюсь объяснить в других данных:
print (df)
id date value
0 A 02-04-2000 3
1 A 03-04-2000 8
2 B 04-04-2000 12
3 A 02-04-2000 7
4 A 03-04-2000 5
5 C 04-04-2000 2
new = {k: g.drop('id', axis=1)
for k, g in df.groupby(pd.factorize(df['id'])[0] 1)}
#all A rows is first group
print (new[1])
date value
0 02-04-2000 3
1 03-04-2000 8
3 02-04-2000 7
4 03-04-2000 5
#all C rows is third group
print (new[3])
date value
5 04-04-2000 2
Группировка по последовательным группам:
print (df)
id date value
0 A 02-04-2000 3 <- 1group
1 A 03-04-2000 8 <- 1group
2 B 04-04-2000 12 <- 2group
3 A 02-04-2000 7 <- 3group
4 A 03-04-2000 5 <- 3group
5 C 04-04-2000 2 <- 4group
new = {k: g.drop('id', axis=1)
for k, g in df.groupby(df['id'].ne(df['id'].shift()).cumsum())}
#first group
print (new[1])
date value
0 02-04-2000 3
1 03-04-2000 8
#fourth group
print (new[3])
date value
3 02-04-2000 7
4 03-04-2000 5
Ответ №2:
# generate new dict
new = {}
# get unique id values
unique_ids = df['id'].unique()
for index, value in zip(range(len(unique_ids)), unique_ids):
new[index] = df[df['id'] == value].copy()