Python 数据帧-基于列标题添加字段
我有一个pandas数据框,其中列标题中有一些信息,我想添加到每一行。数据帧看起来像:Python 数据帧-基于列标题添加字段,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个pandas数据框,其中列标题中有一些信息,我想添加到每一行。数据帧看起来像: print working_df Retail Sales of Electricity : Arkansas : Industrial : Annual \ Year 0 16709.19
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笔记本上工作,只是在笔记本的另一部分重置了一些变量。再次感谢,我以后一定会记住这种方法。