最近在实际项目使用Dataframe的时候遇到一个坑。
那就是假如我先对Dataframe进行GroupBy 分组,然后再对各组进行遍历。
它的顺序是并不是我们之前的排序顺序。具体如下:
在import pandas as pd
test_df = pd.DataFrame([[1,88,888],[1,99,999],[3,33,333],[3,44,444],[3,55,555],[6,66,666]],columns=['id','c1','c2'])
test_df = test_df.sort_values(by=['c2'])
test_df.head(6)
当我们执行这点代码的时候,我们会得到一个这样的Dataframe。之所以没有按照id排序是因为我们最Dataframe做了排序要求,以c2为没仪表
index | id | c1 | c2 |
---|
2 | 3 | 33 | 333 |
3 | 3 | 44 | 444 |
4 | 3 | 55 | 555 |
5 | 6 | 66 | 666 |
0 | 1 | 88 | 888 |
1 | 1 | 99 | 999 |
紧接着当我们再执行:
test_group = test_df.groupby(['id'])
for i,test in test_group:
print(test)
这时候我们就会得到一个这样的结果
index | id | c1 | c2 |
---|
0 | 1 | 88 | 888 |
1 | 1 | 99 | 999 |
index | id | c1 | c2 |
---|
2 | 3 | 33 | 333 |
3 | 3 | 44 | 444 |
4 | 3 | 55 | 555 |
这里不难发现,groupby之后的顺序,其实并不是我们想要的排序顺序。
那是因为我们又以id作为分组,所以排序方式变成了id为主。
要解决这个问题,我查了一下官方文档。在官方文档的groupby里面有这么一个参数是可以传的。
大致意思就是这个参数可以调整groupby方法是否按照group key进行排序。然后它的默认是True。所以才会导致groupby之后和我们sort的顺序有偏差。所以假如要保持原来顺序,我们应该:
test_group = test_df.groupby(['id'],sort=False)
for i,test in test_group:
print(test)
index | id | c1 | c2 |
---|
2 | 3 | 33 | 333 |
3 | 3 | 44 | 444 |
4 | 3 | 55 | 555 |
index | id | c1 | c2 |
---|
0 | 1 | 88 | 888 |
1 | 1 | 99 | 999 |
最后就可以得到应有的排序了。