数据框转换为长格式

9

我有以下数据框:

tz.head()

    state   2004    2005    2006    2007    2008    2009    2010    2011    2012    2013    2014    2015
0   AL      5.7     4.5     4.0     4.0     5.7     11.0    10.5    9.6     8.0     7.2     6.8     6.1
1   AK      7.5     6.9     6.6     6.3     6.7     7.7     7.9     7.6     7.1     6.9     6.9     6.5
2   AZ      5.0     4.7     4.2     3.9     6.2     9.9     10.4    9.5     8.3     7.7     6.8     6.1
3   AR      5.7     5.2     5.2     5.3     5.5     7.8     8.2     8.3     7.6     7.3     6.1     5.2
4   CA      6.2     5.4     4.9     5.4     7.3     11.2    12.2    11.7    10.4    8.9     7.5     6.2

我希望将其更改为类似于这样的外观:
year    state   unemployment
2004    AL  5.7
2005    AL  4.5
2006    AL  4.0
2007    AL  4.0
2008    AL  5.7
2009    AL  11.0
2010    AL  10.5
2011    AL  9.6
2012    AL  8.0
2013    AL  7.2
2014    AL  6.8
2015    AL  6.1
2004    AK  7.5
2005    AK  6.9
2006    AK  6.6
2007    AK  6.3
2008    AK  6.7
2009    AK  7.7
2010    AK  7.9
2011    AK  7.6
2012    AK  7.1
2013    AK  6.9
2014    AK  6.9
2015    AK  6.5

原因是我有一个与其类似的数据框,我需要将这两个数据框合并。最近我遇到了类似的数据框格式问题,在使用Python时无法找到简单快速的解决方案。请问是否有人知道如何解决这种问题?

2个回答

13

你可以使用melt函数:

print pd.melt(df,id_vars=['state'],var_name='year', value_name='unemployment')

   state  year  unemployment
0     AL  2004           5.7
1     AK  2004           7.5
2     AZ  2004           5.0
3     AR  2004           5.7
4     CA  2004           6.2
5     AL  2005           4.5
6     AK  2005           6.9
7     AZ  2005           4.7
8     AR  2005           5.2
9     CA  2005           5.4
10    AL  2006           4.0
11    AK  2006           6.6
12    AZ  2006           4.2
13    AR  2006           5.2
14    CA  2006           4.9
15    AL  2007           4.0
16    AK  2007           6.3
17    AZ  2007           3.9
18    AR  2007           5.3
19    CA  2007           5.4
20    AL  2008           5.7
21    AK  2008           6.7
22    AZ  2008           6.2
23    AR  2008           5.5
24    CA  2008           7.3
25    AL  2009          11.0
26    AK  2009           7.7
27    AZ  2009           9.9
28    AR  2009           7.8
29    CA  2009          11.2
30    AL  2010          10.5
31    AK  2010           7.9
32    AZ  2010          10.4
33    AR  2010           8.2
34    CA  2010          12.2
35    AL  2011           9.6
36    AK  2011           7.6
37    AZ  2011           9.5
38    AR  2011           8.3
39    CA  2011          11.7
40    AL  2012           8.0
41    AK  2012           7.1
42    AZ  2012           8.3
43    AR  2012           7.6
44    CA  2012          10.4
45    AL  2013           7.2
46    AK  2013           6.9
47    AZ  2013           7.7
48    AR  2013           7.3
49    CA  2013           8.9
50    AL  2014           6.8
51    AK  2014           6.9
52    AZ  2014           6.8
53    AR  2014           6.1
54    CA  2014           7.5
55    AL  2015           6.1
56    AK  2015           6.5
57    AZ  2015           6.1
58    AR  2015           5.2
59    CA  2015           6.2

你需要排序吗?没问题,我等着。 - jezrael
1
我已经多次查阅了这个答案,但就是记不住该怎么做了...为了完整起见,我添加了一个使用pd.wide_to_long的答案。 - rvf

4

除了 melt 之外,pandas 还提供了 wide_to_long,根据文档描述,它比 melt 更易于使用,但灵活性较差。

# Adding prefixes here to get nice column names afterwards
df = df.add_prefix('unemployment')
df.rename(columns={'unemploymentstate': 'state'}, inplace=True)

# Reshaping to long/tidy format
pd.wide_to_long(df, stubnames='unemployment', i='state', j='year')

        unemployment
state   year    
AL  2004    5.7
AK  2004    7.5
AZ  2004    5.0
AR  2004    5.7
CA  2004    6.2
AL  2005    4.5
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接