Как сохранить объекты pandas groupby() в одной переменной с разными индексами

#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()