如何将一列的值设置为数据帧中的列?

时间:2019-07-10 11:08:32

标签: python-3.x pandas

我正在寻找更好的代码来转换我的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可能会对我有所帮助。有什么想法吗?

2 个答案:

答案 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上进行了测试。