【问题标题】:long to wide format in pandas with multiple groups具有多个组的熊猫中的长到宽格式
【发布时间】:2020-03-06 21:27:51
【问题描述】:

我有一个类似格式的数据集:

CITY - YEAR - ATTRIBUTE - VALUE
## example:

dallas-2002-crime-100
dallas-2003-crime-101
dallas-2002-population-4000
houston-2002-population-4100
etc....

我正在尝试将这种长格式转换为宽格式,以便每个 city+year 值都是一行,attributes 的所有不同组合都是列名.

因此这个新的数据框看起来像:

###
city - year - population - crime - median_income- etc....

我查看了 pivot 函数,但它似乎不支持用于重塑的多索引。有人可以让我知道如何解决转调吗?此外,我试图看看 pd.pivot_table 但似乎这通常只适用于具有总和、平均值等的数字数据。我的大多数 VALUE 属性实际上都是字符串,所以我似乎无法使用它。

### doesn't work - can't use a multindex 
df.pivot(index=['city','year'], columns = 'attribute', values='value') 

感谢您的帮助!

【问题讨论】:

  • 试试pd.crosstab( [df["CITY"], df["YEAR"]], df["ATTRIBUTE"], values=df["VALUE"], aggfunc=lambda x: x ),如果你显示你想要的实际数据框而不是扁平列的列表,这会有所帮助
  • 您的样本city - year - population - crime - median_income- etc....,这是您的列标题,还是什么?请提供一个列样本和几行您希望它看起来的样子。你是什​​么意思“它不起作用”?请提供输出示例,因为这对我有用。

标签: python pandas pivot pivot-table


【解决方案1】:

这是你要找的东西吗:

import pandas as pd
from io import StringIO

data = """city-year-attribute-value
dallas-2002-crime-100
dallas-2003-crime-101
dallas-2002-population-4000
houston-2002-population-4100"""

df = pd.read_csv(StringIO(data), sep="-")

pivoted = df.pivot_table(
    index=["city", "year"],
    columns=["attribute"],
    values=["value"]
)
print(pivoted.reset_index())

结果:

              city  year  value           
attribute                 crime population
0           dallas  2002  100.0     4000.0
1           dallas  2003  101.0        NaN
2          houston  2002    NaN     4100.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多