在python pandas中将多年列转换为一年列(整齐格式)

时间:2019-10-21 04:02:31

标签: python python-3.x pandas pandas-groupby

我的数据集的格式为:

enter image description here

我想将其转换为:

enter image description here

如何在Python中使用熊猫来做到这一点?

它解决了感谢,感谢您的宝贵时间! +1

4 个答案:

答案 0 :(得分:2)

尝试一下:

pd.melt(df, id_vars=['name'], value_vars=['2016', '2017', '2018',"2019"],var_name='year', value_name='value').sort_values('name')

输出:


+----+-------+-------+-------+
|    | name  | year  | value |
+----+-------+-------+-------+
| 0  | abc   | 2016  |     1 |
| 2  | abc   | 2017  |     2 |
| 4  | abc   | 2018  |     5 |
| 6  | abc   | 2019  |     9 |
| 1  | def   | 2016  |     5 |
| 3  | def   | 2017  |     8 |
| 5  | def   | 2018  |     8 |
| 7  | def   | 2019  |     4 |
+----+-------+-------+-------+

答案 1 :(得分:1)

您可以使用

a = df.columns[1:]
df.melt(id_vars='name',value_vars = a,var_name='year').sort_values('name')

答案 2 :(得分:1)

  • pandas.melt是将数据帧转换为tidy format的最简单方法。
    • 取消数据框从宽格式到长格式的显示,可以选择保留标识符变量。
  • 另一种方法是pandas.wide_to_long
    • 将面板宽屏显示为长格式。较不灵活,但比融合更人性化。
import pandas as pd

# create dataframe
df = pd.DataFrame({'name': ['abc', 'def'],
                   '2016': [1, 5],
                   '2017': [2, 8],
                   '2018': [5, 8],
                   '2019': [9, 4]})

name  2016  2017  2018  2019
 abc     1     2     5     9
 def     5     8     8     4

# melt df
df_melt = df.melt(id_vars='name', value_vars=['2016', '2017', '2018', '2019'])

name variable  value
 abc     2016      1
 def     2016      5
 abc     2017      2
 def     2017      8
 abc     2018      5
 def     2018      8
 abc     2019      9
 def     2019      4

答案 3 :(得分:1)

您可以使用pandas.melt而不指定value_vars

  

如果未指定,则使用未设置为id_vars的所有列。

df.melt(id_vars='name', var_name='year').sort_values('name')

  name  year  value
0  abc  2016      1
2  abc  2017      2
4  abc  2018      5
6  abc  2019      9
1  def  2016      5
3  def  2017      8
5  def  2018      8
7  def  2019      4