我有一个DataFrame
,其中的行被分组'在第三列(一个'组中的行'在第三列中具有相同的值):
c1 c2 c3
0 b 1
1 r 1
2 f 2
3 x 2
4 n 2
5 r 3
6 f 3
但是第二列中的值的顺序错误。我需要在每个组中反转行,因此DataFrame
应该如下所示:
c1 c2 c3
0 r 1
1 b 1
2 n 2
3 x 2
4 f 2
5 f 3
6 r 3
是否有一种有效的方法可以使用DataFrame
将第一个pandas
转换为第二个{{1}}?
UPD:更新了更清晰的示例。这些值应该完全相反,而不仅仅是按字母顺序排列。
答案 0 :(得分:3)
您似乎需要sort_values
:
df = df.sort_values(['c3','c2'])
print (df)
c1 c2 c3
1 1 a 1
0 0 b 1
4 4 aa 2
3 3 bb 2
2 2 cc 2
6 6 xxx 3
5 5 zzz 3
编辑:
您可以使用groupby
并按[::-1]
更改订单:
#more general solution, working with not unique index also
def reversing(x):
x['c2'] = x['c2'].iloc[::-1].values
return x
df = df.groupby('c3', sort=False)).apply(reversing)
print (df)
c1 c2 c3
0 0 r 1
1 1 b 1
2 2 n 2
3 3 x 2
4 4 f 2
5 5 f 3
6 6 r 3
#solution working only with unique monotonic increasing index, because reset index
df['c2'] = df.groupby('c3', sort=False)['c2'].apply(lambda x: x[::-1]).reset_index(drop=True)
print (df)
c1 c2 c3
0 0 r 1
1 1 b 1
2 2 n 2
3 3 x 2
4 4 f 2
5 5 f 3
6 6 r 3
解决方案,其中c1
中的值顺序已更改:
您可以按索引排序(必须是唯一的单调增加)。
df=df.reset_index().sort_values(['c3','index'],ascending=[True, False]).drop('index',axis=1)
print (df)
c1 c2 c3
1 1 r 1
0 0 b 1
4 4 n 2
3 3 x 2
2 2 f 2
6 6 f 3
5 5 r 3
如果列c1
是唯一的单调递增(0,1,2 ..)作为默认索引:
df = df.sort_values(['c3','c1'], ascending=[True, False])
print (df)
c1 c2 c3
1 1 r 1
0 0 b 1
4 4 n 2
3 3 x 2
2 2 f 2
6 6 f 3
5 5 r 3