数据帧:
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
- 按批号先分组后分组
- 获得每个批次的第一件物品
- 最终获得每个批次中每个第一件物品的最大日期
输出应该是:
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>0 1 30 12 g td> 40 23 k 69 表类>