Python 如何使用数据透视表对值和索引进行排序
提供这些数据:Python 如何使用数据透视表对值和索引进行排序,python,pandas,Python,Pandas,提供这些数据: data = [{'Group1': 'A', 'Group2 date':'01/20/20', 'value1':0, 'value2':1}, {'Group1': 'A', 'Group2 date':'01/25/20', 'value1':0, 'value2':3}, {'Group1': 'A', 'Group2 date':'02/28/20', 'value1':0, 'value2':2}, {'Gro
data = [{'Group1': 'A', 'Group2 date':'01/20/20', 'value1':0, 'value2':1},
{'Group1': 'A', 'Group2 date':'01/25/20', 'value1':0, 'value2':3},
{'Group1': 'A', 'Group2 date':'02/28/20', 'value1':0, 'value2':2},
{'Group1': 'B', 'Group2 date':'01/25/20', 'value1':0, 'value2':1},
{'Group1': 'B', 'Group2 date':'01/27/20', 'value1':2, 'value2':2},
{'Group1': 'C', 'Group2 date':'01/29/20', 'value1':0, 'value2':5},
{'Group1': 'C', 'Group2 date':'01/30/20', 'value1':2, 'value2':6}]
我使用熊猫创建了一个透视表,使用:
pivot = pd.pivot_table(
df,
index=["Group1", "Group2 date"],
values=["value1", "value2"],
aggfunc={"value1":np.sum, "value2":np.sum},
)
我得到一张这样的桌子:
value1 value2
Group1 Group2 date
A 01/20/20 0 1
01/25/20 0 3
01/28/20 0 2
B 01/25/20 0 1
01/27/20 2 2
C 01/29/20 0 5
01/30/20 2 6
但我需要首先将表按值2排序并具有最高值,然后将Group2 date始终降序以获得如下结果:
value1 value2
Group1 Group2 date
C 01/30/20 2 6
01/29/20 0 5
A 01/28/20 0 2
01/25/20 0 3
01/20/20 0 1
B 01/27/20 2 2
01/25/20 0 1
有可能吗?怎么可能?这就是我可以得出的结论:让我知道它是否适合你。我使用了你的数据,只是在一个扁平的形式,因为我没有成功地在多索引中读取
data = '''
Group1 Group2_date value1 value2
A 01/20/20 0 1
A 01/25/20 0 3
A 01/28/20 0 2
B 01/25/20 0 1
B 01/27/20 2 2
C 01/29/20 0 5
C 01/30/20 2 6
'''
df = pd.read_csv(StringIO(data), sep='\s+',engine='python')
#create a temp column, getting the max dates from each group
df['filler'] = df.groupby('Group1').Group2_date.transform('max')
#sort dataframe on filler and group1, so that the latest dates are at the top
df = df.sort_values(['filler','Group1'],ascending=False)
#list comprehension on a second groupby, this time using the filler and Group1
#note the use of loc to flip the rows
M = [group.loc[::-1,]
for name, group in
df.groupby(['filler','Group1'],sort=False)]
#concat and print result
outcome = pd.concat(M).drop('filler',axis=1)
Group1 Group2_date value1 value2
6 C 01/30/20 2 6
5 C 01/29/20 0 5
2 A 01/28/20 0 2
1 A 01/25/20 0 3
0 A 01/20/20 0 1
4 B 01/27/20 2 2
3 B 01/25/20 0 1
是否也按组排序?group1列排序不重要。具有最高值2的group1行应位于顶部,并从下向下。Group2 date应该在每个group1中始终按降序排序。以group1-A为例:日期按降序排序,但值不是2,3,1。此外,我认为这里的解决方案应该会有所帮助:这些天的值是可以的,01/28/20应该是2,而另一天的值是相同的。值不能更改,只能更改行位置。不幸的是,您向我展示的解决方案对我没有帮助,我只是把结果放在后面。在末尾设置_index[Group1,Group2 date],inplace=True以获得我想要的结果,但我已经意识到,如果在同一个组1上有两行以上具有相同的组2日期,则不会像pivot_表那样将value1和value2考虑在内进行汇总