【问题标题】:Sorting Pandas data frame with groupby and conditions使用 groupby 和条件对 Pandas 数据框进行排序
【发布时间】:2019-06-27 14:24:01
【问题描述】:

我正在尝试根据满足条件的组对数据框进行排序。

我在对组进行排序时遇到语法错误。 在尝试上述操作之前,我丢失了数据框的初始顺序。

这是我想要达到的排序顺序:

1) 按第一列和测试列排序。

2) 测试==1 组,按次要列排序,然后按最终列排序。

---Test==0 组,仅按 Final 列排序。

import pandas as pd

df=pd.DataFrame({"First":[100,100,100,100,100,100,200,200,200,200,200],"Test":[1,1,1,0,0,0,0,1,1,1,0],"Secondary":[.1,.1,.1,.2,.2,.3,.3,.3,.3,.4,.4],"Final":[1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.10,11.11]})

def sorter(x):
    if x["Test"]==1:
        x.sort_values(['Secondary','Final'], inplace=True)
    else:
        x=x.sort_values('Final', inplace=True)


df=df.sort_values(["First","Test"],ascending=[False, False]).reset_index(drop=True)


df.groupby(['First','Test']).apply(lambda x: sorter(x))

df

Expected result:

First Test Secondary Final
200     1   0.4     10.1
200     1   0.3*    9.9*
200     1   0.3*    8.8*

200     0   0.4     11.11*
200     0   0.3     7.7*

100     1   0.5     2.2
100     1   0.1*    3.3*
100     1   0.1*    1.1*

100     0   0.3     6.6*
100     0   0.2     5.5*
100     0   0.2     4.4*

【问题讨论】:

  • 除了一个之外,您还有其他测试值吗?如果不是,我认为下面的答案应该可以正常工作。

标签: pandas pandas-groupby


【解决方案1】:

您可以尝试不使用 groupby 的降序排序, w.r.t 你给出的序列,排序顺序会改变。它对你有用吗

df=pd.DataFrame({"First":[100,100,100,100,100,100,200,200,200,200,200],"Test":[1,1,1,0,0,0,0,1,1,1,0],"Secondary":[.1,.5,.1,.9,.4,.1,.3,.3,.3,.4,.4],"Final":[1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.10,11.11]})

df = df.groupby(['First','Test']).apply(lambda x: x.sort_values(['First','Test','Secondary','Final'],ascending=False) if x.iloc[0]['Test']==1 else x.sort_values(['First','Test','Final'],ascending=False)).reset_index(drop=True)
df.sort_values(['First','Test'],ascending=[True,False])

输出:

    Final   First   Secondary   Test
3   2.20    100 0.5 1
4   3.30    100 0.1 1
5   1.10    100 0.1 1
0   6.60    100 0.1 0
1   5.50    100 0.4 0
2   4.40    100 0.9 0
8   10.10   200 0.4 1
9   9.90    200 0.3 1
10  8.80    200 0.3 1
6   11.11   200 0.4 0
7   7.70    200 0.3 0

【讨论】:

  • 我在代码中尝试不同的原因是,Secondary 列应该在 Test==1 的地方发挥作用,而在 Test==0 的地方应该被忽略。该解决方案不适用于稍微修改的数据框 df=pd.DataFrame({"First":[100,100,100,100,100,100,200,200,200,200,200],"Test":[1,1,1,0,0,0,0,1,1, 1,0],"次要":[.1,.5,.1,.9,.4,.1,.3,.3,.3,.4,.4],"决赛":[1.1 ,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.10,11.11]}) 知道如何修改代码以避免语法错误吗?谢谢
  • 嗨@Kdog,我刚刚合并了更改:-)
【解决方案2】:

诀窍是分别对子集进行排序并替换原始 df 中的值。 这出现在熊猫排序问题的其他解决方案中。

import pandas as pd


df=pd.DataFrame({"First":[100,100,100,100,100,100,200,200,200,200,200],"Test":[1,1,1,0,0,0,0,1,1,1,0],"Secondary":[.1,.5,.1,.9,.4,.1,.3,.3,.3,.4,.4],"Final":[1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.10,11.11]})

df.sort_values(['First','Test','Secondary','Final'],ascending=False, inplace=True)

index_subset=df[df["Test"]==0].index
sorted_subset=df[df["Test"]==0].sort_values(['First','Final'],ascending=False)

df.loc[index_subset,:]=sorted_subset.values

print(df)

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 2016-11-04
    • 2021-08-27
    • 2021-01-01
    • 2015-09-16
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多