Python 2.7 熊猫数据帧:如何按值分组?

Python 2.7 熊猫数据帧:如何按值分组?,python-2.7,pandas,numpy,scipy,Python 2.7,Pandas,Numpy,Scipy,我正在使用以下熊猫数据帧(来自csv文件): 我有500名买家竞购项目1和项目2,以下200名买家竞购项目3和项目4 buyer600 item3 item4 63 82 .. .. buyer800 item3 item4 40 12 我对Bid1和bid2求和,这样我就可以排序找到最大出价,现在我只想找到并保留每组最多5个出价。。第1组(项目1+2)和第2组(项目3+4)。我怎么做 这是我到目前为止的代码 import pan

我正在使用以下熊猫数据帧(来自csv文件):

我有500名买家竞购项目1和项目2,以下200名买家竞购项目3和项目4

buyer600       item3   item4       63   82
..
..
buyer800       item3   item4       40   12
我对Bid1和bid2求和,这样我就可以排序找到最大出价,现在我只想找到并保留每组最多5个出价。。第1组(项目1+2)和第2组(项目3+4)。我怎么做

这是我到目前为止的代码

import pandas as pd

df = pd.read)csv('myfile.csv')
sum = (df[df.columns[4:]].sum(1))
df['sum'] = calc
df.sort_values(['sort of sum'], ascending=[False], inplace=True)
df.to_csv('results.csv')
输出应该类似于

-----------------------------------------
buyer    itemX   itemY   sum of bid 
---------------------------------‌​-------- 
buyer13  item1   item2     350 
buyer2   item1   item2     283 
buyer65  item1   item2     236         
buyer602 item3   item4     80 
buyer703 item3   item4     76 
buyer640 item3   item4     69 

一种方法是创建两个数据帧,一个用于item1和2买家,另一个用于item3和4买家

df1 = df[df['itemX'] == 'item1']
df2 = df[df['itemX'] == 'item3']
然后,您可以创建一个新列,对出价进行求和

df1['sum_bids'] = df1['bid1'] + df1['bid2']
然后使用
sort\u值对数据帧进行排序

sorted_df1 = df1.sort_values(['sum_bids'], ascending=False)
然后你可以重新索引它们

sorted_df1.index = range(1,len(sorted_df1) + 1)
然后选择前5行

max_bids = sorted_df1[:5]

一种方法是创建两个数据帧,一个用于item1和2买家,另一个用于item3和4买家

df1 = df[df['itemX'] == 'item1']
df2 = df[df['itemX'] == 'item3']
然后,您可以创建一个新列,对出价进行求和

df1['sum_bids'] = df1['bid1'] + df1['bid2']
然后使用
sort\u值对数据帧进行排序

sorted_df1 = df1.sort_values(['sum_bids'], ascending=False)
然后你可以重新索引它们

sorted_df1.index = range(1,len(sorted_df1) + 1)
然后选择前5行

max_bids = sorted_df1[:5]

首先,我将制作一个示例数据帧,我认为它与您描述的数据帧类似

bids_df = pd.DataFrame({'buyer_id': ['buyer' + str(i) for i in range(1, 501)] + ['buyer' + str(i) for i in range(600, 800)],
                    'itemX': ['item1'] * 500 + ['item3'] * 200,
                    'itemY': ['item2'] * 500 + ['item4'] * 200,
                    'bid1': [randint(10, 100) for _ in range(700)],
                    'bid2': [randint(10, 100) for _ in range(700)]})
bids_df = bids_df[['buyer_id', 'itemX', 'itemY', 'bid1', 'bid2']]
然后我们可以为出价和排序的总和添加一列:您已经在您的问题中做了这么多了

bids_df['bid_sum'] = bids_df['bid1'] + bids_df['bid2']
bids_df = bids_df.sort_values(by=['bid_sum'], ascending=False)
最后,我们可以按您描述的项目对数据帧进行分组,只需从每个组中获取前5行(因为我们已经按出价和对它们进行了排序)

这将给出生成的数据帧:

     buyer_id  itemX  itemY  bid1  bid2  bid_sum
60    buyer61  item1  item2    99    97      196
498  buyer499  item1  item2    98    97      195
470  buyer471  item1  item2    92    99      191
120  buyer121  item1  item2    98    93      191
50    buyer51  item1  item2   100    91      191
573  buyer673  item3  item4   100    94      194
639  buyer739  item3  item4    90    95      185
512  buyer612  item3  item4    89    94      183
691  buyer791  item3  item4   100    78      178
659  buyer759  item3  item4    87    91      178

首先,我将制作一个示例数据帧,我认为它与您描述的数据帧类似

bids_df = pd.DataFrame({'buyer_id': ['buyer' + str(i) for i in range(1, 501)] + ['buyer' + str(i) for i in range(600, 800)],
                    'itemX': ['item1'] * 500 + ['item3'] * 200,
                    'itemY': ['item2'] * 500 + ['item4'] * 200,
                    'bid1': [randint(10, 100) for _ in range(700)],
                    'bid2': [randint(10, 100) for _ in range(700)]})
bids_df = bids_df[['buyer_id', 'itemX', 'itemY', 'bid1', 'bid2']]
然后我们可以为出价和排序的总和添加一列:您已经在您的问题中做了这么多了

bids_df['bid_sum'] = bids_df['bid1'] + bids_df['bid2']
bids_df = bids_df.sort_values(by=['bid_sum'], ascending=False)
最后,我们可以按您描述的项目对数据帧进行分组,只需从每个组中获取前5行(因为我们已经按出价和对它们进行了排序)

这将给出生成的数据帧:

     buyer_id  itemX  itemY  bid1  bid2  bid_sum
60    buyer61  item1  item2    99    97      196
498  buyer499  item1  item2    98    97      195
470  buyer471  item1  item2    92    99      191
120  buyer121  item1  item2    98    93      191
50    buyer51  item1  item2   100    91      191
573  buyer673  item3  item4   100    94      194
639  buyer739  item3  item4    90    95      185
512  buyer612  item3  item4    89    94      183
691  buyer791  item3  item4   100    78      178
659  buyer759  item3  item4    87    91      178