如何在pandas

时间:2017-08-22 23:20:26

标签: python pandas

我试图在groupby之后从每个组中的第一条记录中找到具有最大值的记录,并从原始数据框中删除相同的记录。

import pandas as pd
df = pd.DataFrame({'item_id': ['a', 'a', 'b', 'b', 'b', 'c', 'd'], 
                   'cost': [1, 2, 1, 1, 3, 1, 5]})
print df 
t = df.groupby('item_id').first() #lost track of the index
desired_row = t[t.cost == t.cost.max()]
#delete this row from df

         cost
item_id      
d           5

我需要跟踪desired_row并从df删除此行并重复此过程。

查找和删除desired_row的最佳方式是什么?

4 个答案:

答案 0 :(得分:2)

我不确定一般的方法,但这可以在你的情况下工作,因为你正在采取每个组的第一项(它也很容易在最后一个工作)。事实上,由于分裂 - 聚合 - 组合的一般性质,我认为如果不自己动手,这很容易实现。

gb = df.groupby('item_id', as_index=False)
>>> gb.groups  # Index locations of each group.
{'a': [0, 1], 'b': [2, 3, 4], 'c': [5], 'd': [6]}

# Get the first index location from each group using a dictionary comprehension.
subset = {k: v[0] for k, v in gb.groups.iteritems()}
df2 = df.iloc[subset.values()]
# These are the first items in each groupby.
>>> df2
   cost item_id
0     1       a
5     1       c
2     1       b
6     5       d

# Exclude any items from above where the cost is equal to the max cost across the first item in each group.
>>> df[~df.index.isin(df2[df2.cost == df2.cost.max()].index)]
   cost item_id
0     1       a
1     2       a
2     1       b
3     1       b
4     3       b
5     1       c

答案 1 :(得分:1)

试试这个?

import pandas as pd
df = pd.DataFrame({'item_id': ['a', 'a', 'b', 'b', 'b', 'c', 'd'],
                   'cost': [1, 2, 1, 1, 3, 1, 5]})
t=df.drop_duplicates(subset=['item_id'],keep='first')
desired_row = t[t.cost == t.cost.max()]
df[~df.index.isin([desired_row.index[0]])]

Out[186]: 
   cost item_id
0     1       a
1     2       a
2     1       b
3     1       b
4     3       b
5     1       c

答案 2 :(得分:0)

或者不在

中使用

考虑这个带有更多行的df

pd.DataFrame({'item_id': ['a', 'a', 'b', 'b', 'b', 'c', 'd', 'd','d'], 
               'cost': [1, 2, 1, 1, 3, 1, 5,1,7]})

df[~df.cost.isin(df.groupby('item_id').first().max().tolist())]

    cost    item_id
0   1       a
1   2       a
2   1       b
3   1       b
4   3       b
5   1       c
7   1       d
8   7       d

答案 3 :(得分:0)

概述:使用字典创建数据框。按item_id分组并找到最大值。枚举分组的数据框,并使用作为数字值的键返回alpha索引值。如果需要,可以创建一个result_df数据框。

   df_temp = pd.DataFrame({'item_id': ['a', 'a', 'b', 'b', 'b', 'c', 'd'], 
               'cost': [1, 2, 1, 1, 3, 1, 5]})

   grouped=df_temp.groupby(['item_id'])['cost'].max()

   result_df=pd.DataFrame(columns=['item_id','cost'])

   for key, value in enumerate(grouped):
     index=grouped.index[key]
     result_df=result_df.append({'item_id':index,'cost':value},ignore_index=True)

   print(result_df.head(5))