Как выполнить итерацию по строкам фрейма данных, разделить данные на отдельные фреймы данных на основе столбца?

#python #pandas #dataframe

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

Вопрос:

Я просмотрел iterrows, понимание списка, понимание словаря, apply и itertuples. Я не могу заставить кого-либо из них выполнить приведенный ниже сценарий. Любая помощь была бы с благодарностью принята!

Пример исходного фрейма данных:

 ID  |State  |Invoice|Price|Email 
1000|Texas  |1      |2    |texas@test.com
1000|Texas  |2      |5    |texas@test.com
1001|Alabama|3      |4    |alabama@test.com
1000|Texas  |4      |8    |texas@test.com
1002|Georgia|5      |3    |georgia@test.com
1001|Alabama|6      |6    |alabama@test.com
  

Ожидаемый результат Выполните итерацию по исходному фрейму данных, извлеките идентификатор, чтобы включить все данные в отдельные фреймы данных.

DF1:

 ID  |State  |Invoice|Price|Email 
1000|Texas  |1      |2    |texas@test.com
1000|Texas  |2      |5    |texas@test.com
1000|Texas  |4      |8    |texas@test.com
  

Df2:

 ID  |State  |Invoice|Price|Email
1001|Alabama|3      |4    |alabama@test.com
1001|Alabama|6      |6    |alabama@test.com
  

Df3:

 ID  |State  |Invoice|Price|Email
1002|Georgia|5      |3    |georgia@test.com
  

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

1. for _, i in df.groupby("ID"): print (i) . Или {n:i for n, i in df.groupby("ID")} как dict.

2. @HenryYik Я использовал «для n, i в df.groupby(«ID»): print (i)» и он взял первый идентификатор и разделил все связанные строки и данные в новый DF. Как я могу заставить его продолжить работу с исходным фреймом данных, чтобы продолжить перенос дополнительных строк в их собственные фреймы данных?

Ответ №1:

Я смог создать словарь, в котором каждый фрейм данных разделен по идентификатору, используя следующий код:

 dict_of_dfs = {

    ID: group_df 

    for ID, group_df in df.groupby('ID') 

}
  

Я также смог создать список, в котором каждый фрейм данных разделен по идентификатору, используя следующий код:

 list_of_dfs = [

    group_df 

    for _, group_df in df.groupby('ID')

]
  

Ответ №2:

Используя группировщик из pd.groupby

 df1, df2, df3 = [i[1] for i in df.groupby(['ID'])]
  

Используя условия с pd.Series.unique

 df1, df2, df3 = [df[df['ID']==i] for i in df['ID'].unique()]
  

Выходные данные для каждого метода —

 df1
     ID  State  Invoice  Price           Email
0  1000  Texas        1      2  texas@test.com
1  1000  Texas        2      5  texas@test.com
3  1000  Texas        4      8  texas@test.com

#df2
     ID    State  Invoice  Price             Email
2  1001  Alabama        3      4  alabama@test.com
5  1001  Alabama        6      6  alabama@test.com

#df3
     ID    State  Invoice  Price             Email
4  1002  Georgia        5      3  georgia@test.com