分组后需要在列中获得排名值

时间:2019-01-08 13:51:12

标签: python python-3.x pandas

我有一个如下数据框:

function changeText(){
  document.getElementById("p1").innerHTML = "slm"
}

我期望的数据框:

Card_x  Country Age Code    Card_y  Diff
S   INDIA   Adult   Garments    S   9.2
S   INDIA   Adult   Grocery     S   21.33
S   INDIA   Adult   Garments    M   151.4
S   INDIA   Adult   Grocery     M   202.15
S   INDIA   Adult   Grocery     G   48.7
S   INDIA   Adult   Garments    G   126.82
S   INDIA   Adult   Garments    E   19.17
S   INDIA   Adult   Grocery     E   276.09
S   INDIA   Adult   Grocery     D   3.05
S   INDIA   Adult   Garments    D   69.43
S   INDIA   Adult   Grocery     A   109.47
S   INDIA   Adult   Garments    A   161.75

说明: 我想基于每个“代码”的“差异”中的值来获得“卡片_y”中的排名卡

例如

  • “服装”的值为“ S”,其“差值”最少-9.2,因此排名第一。
  • “服装”的值为“ E”和“ Diff”(19.17),因此排在第二,依此类推。

我尝试了以下代码:

Card_x  Country Age     Code       Card_y
S       INDIA   Adult   Garments    S,E,D,G,M,A
S       INDIA   Adult   Grocery     D,S,G,A,M,E

但是我没有得到预期的结果。

3 个答案:

答案 0 :(得分:3)

尝试:

df.sort_values('Diff').groupby(['Card_x','Country','Age','Code'])['Card_y']\
                      .agg(list).reset_index()

输出:

  Card_x Country    Age      Code              Card_y
0      S   INDIA  Adult  Garments  [S, E, D, G, M, A]
1      S   INDIA  Adult   Grocery  [D, S, G, A, M, E]

不在列表中,然后使用

df.sort_values('Diff').groupby(['Card_x','Country','Age','Code'])['Card_y']\
                      .agg(','.join).reset_index()

输出:

   Card_x Country    Age      Code       Card_y
0      S   INDIA  Adult  Garments  S,E,D,G,M,A
1      S   INDIA  Adult   Grocery  D,S,G,A,M,E

答案 1 :(得分:1)

sort_valuesgroupbyjoin一起使用:

df = df.sort_values(['Card_x','Country', 'Age', 'Code', 'Diff'])

df1 = (df.groupby(['Card_x','Country', 'Age', 'Code'])['Card_y']
         .apply(','.join)
         .reset_index())
print (df1)
  Card_x Country    Age      Code       Card_y
0      S   INDIA  Adult  Garments  S,E,D,G,M,A
1      S   INDIA  Adult   Grocery  D,S,G,A,M,E

答案 2 :(得分:0)

我将首先对您的DataFrame进行排序,然后对GroupBy Card_y进行排序,然后获得一个列表。这应该可以解决问题。

df.sort_values("Diff").groupby(["Card_x", "Country","Age","Code"])["Card_y"].apply(list).reset_index()