基于两列+排序后的列值+条件添加索引

时间:2019-09-16 11:11:11

标签: python pandas pandas-groupby

我正在尝试基于两列(在我的情况下为个人和集群)+第三列的排序值(totalPrice)添加索引

所以我有一个包含三列的数据集-个体,集群和totalPrice。

     individual  cluster  totalPrice  totalTripDurationMinutes
0       9710556        1      180.82                       140
1       9710556        0      202.32                       145
2       9710556        0      180.82                       140
3       9710535        7      729.44                       460
4       9710535        7      729.44                       640
5       9710535        7      702.60                       355
6       9710535        7      685.82                       300
7       9710535        7      685.82                       480
8       9710535        7      669.44                       520
9       9710535        7      669.44                       580
10      9710535        7      669.44                       700

我想要为每个个体和每个集群做的事情是,找到由当前totalPrice主导的totalPrice条目的数量。 结果应如下所示:

     individual  dominationCount  cluster  totalPrice  totalTripDurationMinutes
0       9710556     0                1      180.82                       140
1       9710556     0                0      202.32                       145
2       9710556     1                0      180.82                       140
3       9710535     0                7      729.44                       460
4       9710535     0                7      729.44                       640
5       9710535     1                7      702.60                       355
6       9710535     2                7      685.82                       300
7       9710535     2                7      685.82                       480
8       9710535     3                7      669.44                       520
9       9710535     3                7      669.44                       580
10      9710535     3                7      669.44                       700

有什么想法可以用大熊猫制作吗?

4 个答案:

答案 0 :(得分:3)

GroupBy.rankmethos='dense'一起使用并减去1

df['dominatedCount'] = (df.groupby(['individual', 'cluster'])['totalPrice']
                          .rank(ascending=False, method='dense')
                          .astype(int)
                          .sub(1))
print (df)
    individual  cluster  totalPrice  totalTripDurationMinutes  dominatedCount
0      9710556        1      180.82                       140               0
1      9710556        0      202.32                       145               0
2      9710556        0      180.82                       140               1
3      9710535        7      729.44                       460               0
4      9710535        7      729.44                       640               0
5      9710535        7      702.60                       355               1
6      9710535        7      685.82                       300               2
7      9710535        7      685.82                       480               2
8      9710535        7      669.44                       520               3
9      9710535        7      669.44                       580               3
10     9710535        7      669.44                       700               3

答案 1 :(得分:1)

这是一种超级复杂的方法:

result = df.merge(df.merge(df.merge(df[['individual',
                                        'cluster',
                                        'totalPrice']].drop_duplicates(),
                                    on=['individual',
                                        'cluster'],
                                    suffixes=('',
                                              '_new'),
                                    how='left'))
                    .query('totalPrice<totalPrice_new')
                    .drop('totalPrice_new',
                          axis=1)
                    .drop_duplicates()
                    .groupby(['individual',
                              'cluster',
                              'totalPrice'],
                             as_index=False)
                    .count()
                    .rename(columns={'totalTripDurationMinutes': 'dominationCount'}),
                  how='left', on=['individual', 'cluster', 'totalPrice']).fillna(0)

这将导致:

    individual  cluster  totalPrice  totalTripDurationMinutes  dominationCount
0      9710556        1      180.82                       140              0.0
1      9710556        0      202.32                       145              0.0
2      9710556        0      180.82                       140              1.0
3      9710535        7      729.44                       460              0.0
4      9710535        7      729.44                       640              0.0
5      9710535        7      702.60                       355              1.0
6      9710535        7      685.82                       300              2.0
7      9710535        7      685.82                       480              2.0
8      9710535        7      669.44                       520              3.0
9      9710535        7      669.44                       580              3.0
10     9710535        7      669.44                       700              3.0

答案 2 :(得分:0)

您可以定义一个名为check_price的函数:

def check_price(x):
    #sort values of the prices and get only unique elements
    prices = x.sort_values(ascending=False).unique()
    #find index of of each price in the sorted prices to get the dominated count
    dominate =  [np.where(prices==val)[0] for val in x]
    return dominate

然后使用groupbytransform

df['dominatedCount'] = df.groupby(['individual', 'cluster'])['totalPrice'].transform(check_price)
df

    individual  cluster totalPrice  totalTripDurationMinutes    dominatedCount
0   9710556       1        180.82      140                              0.0
1   9710556       0        202.32      145                              0.0
2   9710556       0        180.82      140                              1.0
3   9710535       7        729.44      460                              0.0
4   9710535       7        729.44      640                              0.0
5   9710535       7        702.60      355                              1.0
6   9710535       7        685.82      300                              2.0
7   9710535       7        685.82      480                              2.0
8   9710535       7        669.44      520                              3.0
9   9710535       7        669.44      580                              3.0
10  9710535       7        669.44      700                              3.0

答案 3 :(得分:0)

我将按照(个体,集群,totalPrice)对数据集进行排序,然后添加一列1,然后通过(个体,集群,totalPrice)对数据集求和,这样您就可以得到想要的排名。