折叠数据框的重复行
Collapsing repeating rows of dataframe
我的数据框 df
如下所示:
Col1 Col2 Col3 StartDate EndDate Qty
24HR A1 B1 1/1/2020 1/31/2020 4.2
24HR A1 B1 2/1/2020 2/29/2020 11
asd A2 B2 2/1/2020 2/29/2020 35
asd A2 B2 3/1/2020 3/31/2020 23
asd A2 B2 4/1/2020 4/30/2020 35
asd A2 B2 5/1/2020 5/31/2020 46
我需要根据 Col1, Col2, Col3
中的重复折叠行以获得以下内容:
Col1 Col2 Col3 StartDate EndDate Jan Feb Mar Apr May
24HR A1 B1 1/1/2020 2/29/2020 4.2 11
asd A2 B2 2/1/2020 5/31/2020 35 23 35 46
上面的 StartDate
和 EndDate
是所有列的最小值和最大值。即对于值为 24HR, A1, B1
的列,最小值 StartDate
为 1/1/2020
,最大值 EndDate
为 2/29/2020
.
我尝试了以下方法:
df['MnthName'] = df['StartDate'].dt.strftime('%b')
df = df.pivot_table(index=['Col1', 'Col2', 'Col3'], values='Qty', columns='MnthName')
但我不确定如何将其分组为 select 最小值 StartDate
和最大值 EndDate
对于每个 Col1, Col2, Col3
唯一对。
我们可以 pivot
和 agg
然后 concat
他们在一起
s1=df.pivot_table(index=['Col1','Col2','Col3'],columns='StartDate',values='Qty')
s2=df.groupby(['Col1','Col2','Col3']).agg({'StartDate':'first','EndDate':'last'})
s1.columns=pd.to_datetime(s1.columns,dayfirst=False).strftime('%b')
s=pd.concat([s2,s1],axis=1).reset_index()
s
Col1 Col2 Col3 StartDate EndDate Jan Feb Mar Apr May
0 24HR A1 B1 1/1/2020 2/28/2020 4.2 11.0 NaN NaN NaN
1 asd A2 B2 2/1/2020 5/31/2020 NaN 35.0 23.0 35.0 46.0
我的数据框 df
如下所示:
Col1 Col2 Col3 StartDate EndDate Qty
24HR A1 B1 1/1/2020 1/31/2020 4.2
24HR A1 B1 2/1/2020 2/29/2020 11
asd A2 B2 2/1/2020 2/29/2020 35
asd A2 B2 3/1/2020 3/31/2020 23
asd A2 B2 4/1/2020 4/30/2020 35
asd A2 B2 5/1/2020 5/31/2020 46
我需要根据 Col1, Col2, Col3
中的重复折叠行以获得以下内容:
Col1 Col2 Col3 StartDate EndDate Jan Feb Mar Apr May
24HR A1 B1 1/1/2020 2/29/2020 4.2 11
asd A2 B2 2/1/2020 5/31/2020 35 23 35 46
上面的 StartDate
和 EndDate
是所有列的最小值和最大值。即对于值为 24HR, A1, B1
的列,最小值 StartDate
为 1/1/2020
,最大值 EndDate
为 2/29/2020
.
我尝试了以下方法:
df['MnthName'] = df['StartDate'].dt.strftime('%b')
df = df.pivot_table(index=['Col1', 'Col2', 'Col3'], values='Qty', columns='MnthName')
但我不确定如何将其分组为 select 最小值 StartDate
和最大值 EndDate
对于每个 Col1, Col2, Col3
唯一对。
我们可以 pivot
和 agg
然后 concat
他们在一起
s1=df.pivot_table(index=['Col1','Col2','Col3'],columns='StartDate',values='Qty')
s2=df.groupby(['Col1','Col2','Col3']).agg({'StartDate':'first','EndDate':'last'})
s1.columns=pd.to_datetime(s1.columns,dayfirst=False).strftime('%b')
s=pd.concat([s2,s1],axis=1).reset_index()
s
Col1 Col2 Col3 StartDate EndDate Jan Feb Mar Apr May
0 24HR A1 B1 1/1/2020 2/28/2020 4.2 11.0 NaN NaN NaN
1 asd A2 B2 2/1/2020 5/31/2020 NaN 35.0 23.0 35.0 46.0