从csv人口普查数据创建多索引

时间:2013-09-20 21:23:57

标签: python pandas multi-index

我想创建一个多索引数据框,以便我可以更有条理地计算值。

我知道有一个更优雅的解决方案,但我很难找到它。我发现的大部分内容都涉及系列和元组。我对pandas(和编程)很新,这是我第一次尝试使用/创建多索引。

将人口普查数据下载为csv并创建具有相关字段的数据框后,我有:

county housingunits2010 housingunits2012 occupiedunits2010 occupiedunits2012
8001   120              200              50                100
8002   100              200              75                125

我想最终:

id    Year  housingunits occupiedunits
8001  2010  120          50
      2012  200          100
8002  2010  100          75
      2012  200          125

然后能够从计算值(即年份之间的差异,%变化)和其他数据框中添加列,按县和年匹配合并。

我找到了一个解决方法,使用了我学到的基本方法(见下文),但是......它当然不优雅。任何建议将不胜感激。

首先创建两个差异数据帧

df3 = df2[["county_id","housingunits2012"]]
df4 = df2[["county_id","housingunits2010"]]

添加年份列

df3['year'] = np.array(['2012'] * 7)
df4['year'] = np.array(['2010'] * 7)
df3.columns = ['county_id','housingunits','year']
df4.columns = ['county_id','housingunits','year']

附加

df5 = df3.append(df4)

写给csv

df5.to_csv('/Users/ntapia/df5.csv', index = False)

阅读&排序

df6 = pd.read_csv('/Users/ntapia/df5.csv', index_col=[0, 2])
df6.sort_index(0)

结果(实际数据):

                      housingunits
county_id year              
8001      2010        163229
          2012        163986
8005      2010        238457
          2012        239685
8013      2010        127115
          2012        128106
8031      2010        285859
          2012        288191
8035      2010        107056
          2012        109115
8059      2010        230006
          2012        230850
8123      2010         96406
          2012         97525

谢谢!

1 个答案:

答案 0 :(得分:1)

import re
df = df.set_index('county')
df = df.rename(columns=lambda x: re.search(r'([a-zA-Z_]+)(\d{4})', x).groups())
df.columns = MultiIndex.from_tuples(df.columns, names=['label', 'year'])
s = df.unstack()
s.name = 'count'
print(s)

给出

label          year  county
housingunits   2010  8001      120
                     8002      100
               2012  8001      200
                     8002      200
occupiedunits  2010  8001       50
                     8002       75
               2012  8001      100
                     8002      125
Name: count, dtype: int64

如果您希望DataFrame来电reset_index()

print(s.reset_index())

产量

           label  year  county  numunits
0   housingunits  2010    8001       120
1   housingunits  2010    8002       100
2   housingunits  2012    8001       200
3   housingunits  2012    8002       200
4  occupiedunits  2010    8001        50
5  occupiedunits  2010    8002        75
6  occupiedunits  2012    8001       100
7  occupiedunits  2012    8002       125