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