Python DataFrame多列组与最大值从第一组



数据帧:

df=pd.DataFrame([[1,'a','c1',30,'s1','e1'],[1,'b','c1',60,'s1','e1'],[1,'b','c2',40,'s1','e1'],[2,'g','c1',40,'s2','e2'],[2,'g','c3',9,'s1','e1'],[3,'k','c2',20,'s1','e1'],[3,'k','c2',69,'s2','e1'],[3,'k','c1',29,'s1','e1'],[3,'f','c3',99,'s2','e1']], columns = ['Lot','Item','Code','Date','Shelf','Emp'])
Lot Item Code  Date Shelf Emp
0    1    a   c1    30    s1  e1
1    1    b   c1    60    s1  e1
2    1    b   c2    40    s1  e1
3    2    g   c1    40    s2  e2
4    2    g   c3     9    s1  e1
5    3    k   c2    20    s1  e1
6    3    k   c2    69    s2  e1
7    3    k   c1    29    s1  e1
8    3    f   c3    99    s2  e1

I need to

  1. 按批号先分组后分组
  2. 获得每个批次的第一件物品
  3. 最终获得每个批次中每个第一件物品的最大日期

输出应该是:

Lot Item  Code Date Shelf Emp
0    1    a    c1   30   s1    e1
3    2    g    c2   40   s2    e1
6    3    k    c2   69   s2    e1

谢谢!!

我使用了一些中间步骤(可能有更简单的方法,但这就是我要做的)。

首先,按批次对df进行分组,并使用df.groupby返回每个批次的第一项,以创建临时df:

temp_df1 = df.groupby('Lot', as_index=False).first()[['Lot', 'Item']]
Lot Item
0    1    a
1    2    g
2    3    k

然后我使用df.merge()将原始df合并到temp_df上,以仅从df中获取包含每个批次的第一项的行:

temp_df2 = df.merge(temp_df1, on=['Lot', 'Item'], how='inner')
Lot Item Code  Date Shelf Emp
0    1    a   c1    30    s1  e1
1    2    g   c1    40    s2  e2
2    2    g   c3     9    s1  e1
3    3    k   c2    20    s1  e1
4    3    k   c2    69    s2  e1
5    3    k   c1    29    s1  e1

然后您可以在此数据框架上按Lot和Item分组以获得所需的输出

df_out = temp_df2.groupby(['Lot', 'Item'], as_index=False).max()
Lot Item Code  Date Shelf Emp
0    1    a   c1    30    s1  e1
1    2    g   c3    40    s2  e2
2    3    k   c2    69    s2  e1

完整代码:

temp_df1 = df.groupby('Lot', as_index=False).first()[['Lot', 'Item']]
temp_df2 = df.merge(temp_df1, on=['Lot', 'Item'], how='inner')
df_out = temp_df2.groupby(['Lot', 'Item'], as_index=False).max()

或以下内容,而不创建临时dfs:

df_out = (df.merge(df.groupby('Lot', as_index=False).first()[['Lot', 'Item']],
on=['Lot', 'Item'], how='inner')
.groupby(['Lot', 'Item'], as_index=False).max())

另一个方法:

df1 = df.groupby(['Lot']).first()['Item'].reset_index()
df1['Date'] = [df['Date'].loc[df['Item'] == x].max() for x in df1['Date']]
df1

结果:

<表类>指数很多项日期tbody><<tr>013012g td> 4023k69

最新更新