Python 3.x 对dataframe进行排序并根据元素的排名创建新列

Python 3.x 对dataframe进行排序并根据元素的排名创建新列,python-3.x,pandas,Python 3.x,Pandas,我有以下数据帧: import pandas as pd df = pd.DataFrame( { 'id': [1, 1, 1, 1, 2, 2,2, 2, 3, 3, 3, 3], 'name': ['A', 'B', 'C', 'D','A', 'B','C', 'D', 'A', 'B','C', 'D'], 'Value': [1, 2

我有以下数据帧:

import pandas as pd
df = pd.DataFrame(
                  {
                   'id': [1, 1, 1, 1, 2, 2,2, 2, 3, 3, 3, 3],
                   'name': ['A', 'B', 'C', 'D','A', 'B','C', 'D', 'A', 'B','C', 'D'], 
                   'Value': [1, 2, 3, 4, 5, 6, 0, 2, 4, 6, 3, 5]
                  },
                  columns=['name','id','Value'])`
我可以使用id和值对数据进行排序,如下所示:

df.sort_values(['id','Value'],ascending = [True,False])  
我打印的表格如下所示:

  name   id   Value
    D      1      4
    C      1      3
    B      1      2
    A      1      1
    B      2      6
    A      2      5
    D      2      2
    C      2      0
    B      3      6
    D      3      5
    A      3      4
    C      3      3
我想创建4个新列(Rank1、Rank2、Rank3、Rank4)如果列name中的元素是最高值,则列Rank1将被指定为1否则0。如果列name中的元素是第二高的值,则列Rank2将被指定为1否则0。 Rank3和Rank4也一样

我怎么能这么做

谢谢

Zep使用:

df = df.join(pd.get_dummies(df.groupby('id').cumcount().add(1)).add_prefix('Rank'))
print (df)
   name  id  Value  Rank1  Rank2  Rank3  Rank4
3     D   1      4      1      0      0      0
2     C   1      3      0      1      0      0
1     B   1      2      0      0      1      0
0     A   1      1      0      0      0      1
5     B   2      6      1      0      0      0
4     A   2      5      0      1      0      0
7     D   2      2      0      0      1      0
6     C   2      0      0      0      0      1
9     B   3      6      1      0      0      0
11    D   3      5      0      1      0      0
8     A   3      4      0      0      1      0
10    C   3      3      0      0      0      1
详细信息

对于每组使用的计数,请添加
1

print (df.groupby('id').cumcount().add(1))
3     1
2     2
1     3
0     4
5     1
4     2
7     3
6     4
9     1
11    2
8     3
10    4
dtype: int64
对于指示符列,请使用:


这不需要预先排序

df.join(
    pd.get_dummies(
        df.groupby('id').Value.apply(np.argsort).rsub(4)
    ).add_prefix('Rank')
)

   name  id  Value  Rank1  Rank2  Rank3  Rank4
0     D   1      4      1      0      0      0
1     C   1      3      0      1      0      0
2     B   1      2      0      0      1      0
3     A   1      1      0      0      0      1
4     B   2      6      1      0      0      0
5     A   2      5      0      1      0      0
6     D   2      2      0      0      1      0
7     C   2      0      0      0      0      1
8     B   3      6      1      0      0      0
9     D   3      5      0      1      0      0
10    A   3      4      0      0      1      0
11    C   3      3      0      0      0      1

更有活力

df.join(
    pd.get_dummies(
        df.groupby('id').Value.apply(lambda x: len(x) - np.argsort(x))
    ).add_prefix('Rank')
)

   name  id  Value  Rank1  Rank2  Rank3  Rank4
0     D   1      4      1      0      0      0
1     C   1      3      0      1      0      0
2     B   1      2      0      0      1      0
3     A   1      1      0      0      0      1
4     B   2      6      1      0      0      0
5     A   2      5      0      1      0      0
6     D   2      2      0      0      1      0
7     C   2      0      0      0      0      1
8     B   3      6      1      0      0      0
9     D   3      5      0      1      0      0
10    A   3      4      0      0      1      0
11    C   3      3      0      0      0      1

谢谢你,耶斯雷尔。非常感谢您的帮助,这为我节省了很多时间:)谢谢PirSquareDhmm,如果不使用@I get no notification:)不,但我会解释原因,如果您对commnet好奇,请不要做出任何反应;)那么df.join(pd.get_dummies(df.groupby(“id”)[“Value”].rank().astype(int))呢。添加前缀(“rank”))@Lambda您需要确保首先使用method=first
df.join(
    pd.get_dummies(
        df.groupby('id').Value.apply(lambda x: len(x) - np.argsort(x))
    ).add_prefix('Rank')
)

   name  id  Value  Rank1  Rank2  Rank3  Rank4
0     D   1      4      1      0      0      0
1     C   1      3      0      1      0      0
2     B   1      2      0      0      1      0
3     A   1      1      0      0      0      1
4     B   2      6      1      0      0      0
5     A   2      5      0      1      0      0
6     D   2      2      0      0      1      0
7     C   2      0      0      0      0      1
8     B   3      6      1      0      0      0
9     D   3      5      0      1      0      0
10    A   3      4      0      0      1      0
11    C   3      3      0      0      0      1