我正在寻找更好的代码来转换我的DataFrame
。
我的DataFrame
看起来像这样:
Period LASTDATE PRICE VAT SUM CLIENT
0 2018Q1 31/3/2018 1 2 3 NAME
1 2018Q2 30/6/2018 2 2 4 NAME
2 2018Q3 30/9/2018 3 3 6 NAME
3 2018Q4 31/12/2018 4 4 8 NAME
我想实现这一目标:
2018Q1 2018Q2 2018Q3 2018Q4 LASTDATE SUM
NAME 3 4 6 8 31/12/2018 21
到目前为止,我已将Period
的{{1}}列拆分为一个标题。我相信有更好的方法来编写此代码。我搜索了大熊猫的文档,相信DataFrame
可能会对我有所帮助。有什么想法吗?
答案 0 :(得分:3)
用DataFrame.set_index
创建Series
,用Period
创建索引,用Series.to_frame
转换成一列DataFrame
,用DataFrame.T
转置,最后添加DataFrame.assign
的新列:
df1 = (df.set_index('Period')['SUM']
.to_frame()
.T
.rename_axis(None, axis=1)
.assign(LASTDATE = df['LASTDATE'].iat[-1], SUM = df['SUM'].sum()))
print (df1)
2018Q1 2018Q2 2018Q3 2018Q4 LASTDATE SUM
SUM 3 4 6 8 31/12/2018 21
答案 1 :(得分:2)
不幸的是,如果您有1个以上的客户端,并且没有给您客户端名称作为索引,jezrael的答案将不起作用(如示例输出)。
请尝试以下操作:
df1 = df.pivot(index='CLIENT', columns='Period', values='SUM')
df_agg = df.groupby('CLIENT').agg({'LASTDATE': 'last', 'SUM': 'sum'})
df_fin = pd.concat([df1, df_agg], axis=1)
在第一行中,您调整了数据框的形状,但是丢失了LASTDATE值,您将该值与第二行(以及每个客户端的总和)一起带回,然后在最后一行中合并了数据帧。
对于扩展的虚拟数据帧:
Period LASTDATE PRICE VAT SUM CLIENT
0 2018Q1 31/3/2018 1 2 3 NAME1
1 2018Q2 30/6/2018 2 2 4 NAME1
2 2018Q3 30/9/2018 3 3 6 NAME1
3 2018Q4 31/12/2018 4 4 8 NAME1
4 2018Q1 31/3/2018 2 2 1 NAME2
5 2018Q2 30/6/2018 4 2 2 NAME2
6 2018Q3 30/9/2018 6 3 3 NAME2
7 2018Q4 31/12/2018 8 4 4 NAME2
您应该获得以下信息:
2018Q1 2018Q2 2018Q3 2018Q4 LASTDATE SUM
CLIENT
NAME1 3 4 6 8 31/12/2018 21
NAME2 1 2 3 4 31/12/2018 10
在大熊猫0.24.1上进行了测试。