Python 数据帧-基于列标题添加字段

Python 数据帧-基于列标题添加字段,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个pandas数据框,其中列标题中有一些信息,我想添加到每一行。数据帧看起来像: print working_df Retail Sales of Electricity : Arkansas : Industrial : Annual \ Year 0 16709.19

我有一个pandas数据框,其中列标题中有一些信息,我想添加到每一行。数据帧看起来像:

print working_df

  Retail Sales of Electricity : Arkansas : Industrial : Annual  \
Year                                                                 
0                                           16709.19272              
1                                           16847.75502              
2                                           16993.92202              
3                                           16774.69902              
4                                           14710.29400          

  Retail Sales of Electricity : Arizona : Residential : Annual  \
Year                                                                 
0                                           33138.47860              
1                                           32922.97001              
2                                           33079.07402              
3                                           32448.13802              
4                                           32846.84298     

[8 rows x 701 columns]
如何从列名称中提取两个变量(州,如亚利桑那州,以及部门,如工业或住宅),并将其作为值分别放在两个新列中的行中

我希望字段看起来像

Year      State              Sector                      Sales                       
0         Arizona            Residential                 33138.47860              
1         Arizona            Residential                 32922.97001              
2         Arizona            Residential                 33079.07402              
3         Arizona            Residential                 32448.13802              
4         Arizona            Residential                 32846.84298    
0         Arkansas           Industrial                  16709.19272              
1         Arkansas           Industrial                  16847.75502              
2         Arkansas           Industrial                  16993.92202              
3         Arkansas           Industrial                  16774.69902              
4         Arkansas           Industrial                  14710.29400   

我想我会做一些类似的事情

d2 = df.unstack().reset_index()
d2 = d2.rename(columns={0: "Sales"})
parts = d2.pop("level_0").str.split(":")
d2["State"] = [p[1].strip() for p in parts]
d2["Sector"] = [p[2].strip() for p in parts]
产生

>>> d2
   Year        Sales     State       Sector
0     0  16709.19272  Arkansas   Industrial
1     1  16847.75502  Arkansas   Industrial
2     2  16993.92202  Arkansas   Industrial
3     3  16774.69902  Arkansas   Industrial
4     4  14710.29400  Arkansas   Industrial
5     0  33138.47860   Arizona  Residential
6     1  32922.97001   Arizona  Residential
7     2  33079.07402   Arizona  Residential
8     3  32448.13802   Arizona  Residential
9     4  32846.84298   Arizona  Residential

[10 rows x 4 columns]

你可以更喜欢用
str.extract
-
str.extract(r.*?:\s*(?p.*?\s*:\s*(?p.*?\s*:*)
,但我认为这不值得

你能举一个(缩写)的例子来说明你想要的输出结构是什么样的吗?谢谢@DSM,我用我想要的输出结构的缩写版本编辑了这篇文章;我遵循你在前三行中所做的。但是我在最后两行得到了一个列表索引超出范围的错误,这两行实际上创建了新列。有什么想法吗?@John:那一定是说你的专栏与你给我看的模式不匹配。在它们上面循环,看看哪些是不同的,例如,
print([p表示部分中的p,如果len(p)!=4])
@DSML Hmmm,建议的print语句不会返回任何内容。我滚动查看了部件的输出,其模式似乎非常一致,例如309,“[u'电力零售额',u'加利福尼亚',u'工业',u'年度']”310,“[u'电力零售额',u'加利福尼亚',u'工业',u'年度']”尽管我确信这是我这边的一些问题,正如你的代码所说的,我在一个IPython笔记本上工作,只是在笔记本的另一部分重置了一些变量。再次感谢,我以后一定会记住这种方法。