Как объединить сгруппированные фреймы данных в pandas с одинаковым типом сортировки?

#python #pandas-groupby

#python #pandas-groupby

Вопрос:

У меня есть два сгруппированных фрейма данных с номером недели и персоной в качестве группового индекса. Сгруппированный результат имеет отсортированный порядокr номера недели.

Но если я объединю эти два сгруппированных фрейма данных, порядок номера недели изменится лексически.

Как я могу гарантировать, что порядок объединенных фреймов данных аналогичен сгруппированным фреймам данных, а не лексически?

     df1 = pd.DataFrame(np.array([[1, 'Person A', 3],[1, 'Person C', 9],[1, 'Person C', 2],[10, 'Person D', 9],[2, 'Person K', 9]]),columns=['Week', 'Name', 'Value'])
    df1[["Week", "Value"]] = df1[["Week", "Value"]].apply(pd.to_numeric)

    df2 = pd.DataFrame(np.array([[1, 'Person A', 1], [1, 'Person B', 6], [1, 'Person C', 9], [9, 'Person D', 9], [10, 'Person D', 9]]),columns=['Week', 'Name', 'Value'])
    df2[["Week", "Value"]] = df2[["Week", "Value"]].apply(pd.to_numeric)

    grouped = df1.groupby(['Week', 'Name']).sum().add(df2.groupby(['Week', 'Name']).sum(), fill_value=0)
    grouped = grouped.sort_index(ascending=True)

    df3 = pd.DataFrame(np.array([[1, 'Person A', 1],[1, 'Person C', 2],[1, 'Person C', 3],[10, 'Person D', 9],[2, 'Person K', 4]]),columns=['Week', 'Name', 'Value'])
    df3[["Week", "Value"]] = df3[["Week", "Value"]].apply(pd.to_numeric)

    df4 = pd.DataFrame(np.array([[1, 'Person A', 1], [1, 'Person E', 123], [1, 'Person C', 3], [9, 'Person D', 4], [10, 'Person D', 5]]),columns=['Week', 'Name', 'Value'])
    df4[["Week", "Value"]] = df4[["Week", "Value"]].apply(pd.to_numeric)

    grouped2 = df3.groupby(['Week', 'Name']).sum().add(df4.groupby(['Week', 'Name']).sum(), fill_value=0)
    grouped2 = grouped2.sort_index(ascending=True)


    grouped = grouped.rename(index=str, columns={"Value": "Value1"})
    grouped2 = grouped2.rename(index=str, columns={"Value": "Value2"})


    print(grouped)
    print(grouped2)

               Value1
Week Name            
1    Person A     4.0
     Person B     6.0
     Person C    20.0
2    Person K     9.0
9    Person D     9.0
10   Person D    18.0
               Value2
Week Name            
1    Person A     2.0
     Person C     8.0
     Person E   123.0
2    Person K     4.0
9    Person D     4.0
10   Person D    14.0

concated = pd.concat([grouped, grouped2], axis=1, sort=True)
print(concated)

              Value1  Value2
Week Name                    
1    Person A     4.0     2.0
     Person B     6.0     NaN
     Person C    20.0     8.0
     Person E     NaN   123.0
10   Person D    18.0    14.0
2    Person K     9.0     4.0
9    Person D     9.0     4.0
  

Версия Pandas: 0.24.1

Ответ №1:

Я нашел решение с помощью natsort для сортировки по нескольким индексам: concated = concated.reindex(natsorted(concated.index))