【问题标题】:Pandas Dataframes- Adding Fields Based on Column TitlesPandas Dataframes - 根据列标题添加字段
【发布时间】:2014-04-12 17:27:01
【问题描述】:

我有一个 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   

【问题讨论】:

  • 您能否举一个(简略)示例说明您希望输出结构是什么样的?
  • 感谢@DSM,我用我想要的输出结构的缩写版本编辑了这篇文章。

标签: python pandas dataframe


【解决方案1】:

我想我会做类似的事情

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<State>.*?)\s*:\s*(?P<Sector>.*?)\s*:.*"),也许——但我认为这并不值得。

【讨论】:

  • 非常感谢@DSM;我遵循你在前三行中所做的事情。但是我在实际创建新列的最后两行中遇到了列表索引超出范围错误。有什么想法吗?
  • @John:这一定意味着您的列与您向我展示的模式不匹配。循环遍历它们,看看哪些是不同的,例如print([p for p in parts if len(p) != 4]).
  • @DSML 嗯,您建议的打印语句不会返回任何内容。我滚动浏览了部分的输出,这一切似乎在模式上非常一致,例如309,"[u'电力零售', u'加州', u'工业', u'年度']" 310,"[u'电力零售', u'加州', u'工业', u'Annual']" 虽然我确信这对我来说是个问题,因为你的代码是有道理的。
  • 得到它的工作,我在一个 IPython 笔记本上工作,只需要在笔记本的另一部分重置一些变量。再次感谢,我以后一定会记住这种方法。
猜你喜欢
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
相关资源
最近更新 更多