熊猫:反向具有相同值的行

时间:2017-03-30 11:42:41

标签: python pandas dataframe

我有一个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:更新了更清晰的示例。这些值应该完全相反,而不仅仅是按字母顺序排列。

1 个答案:

答案 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