【问题标题】:Pandas pivot_table with multi-index and duplicate character values具有多索引和重复字符值的 Pandas pivot_table
【发布时间】:2020-09-05 10:15:50
【问题描述】:

我正在尝试像这样旋转数据框

id1 id2 property value
1   2   p        v1  
1   2   p        v2

形成

id1 id2 p
1   2   v1 & v2

到目前为止我的代码是

import pandas as pd
df = pd.DataFrame(data=
    {'id1': [1, 1],
     'id2': [2, 2],
     'property': ['p', 'p'],
     'value': ['v1', 'v2']})
df = df.groupby(["id1", "id2", "property"], as_index=False).agg({'value': ' & '.join})  # 1
print(df)
df = df.pivot_table(index=["id1", "id2"], columns="property", values="value")           # 2
print(df)

输出是

   id1  id2  property  value
0    1    2  p         v1 & v2

pandas.core.base.DataError: No numeric types to aggregate

我无法理解错误消息。有什么可以聚合的? df 在#1 之后是否应该是可旋转的形式?

【问题讨论】:

    标签: python pandas pivot-table multi-index


    【解决方案1】:

    由于默认聚合函数,DataFrame.pivot_table 中的aggfunc 是均值,因此会引发错误。将函数更改为 join 以获得正确的输出:

    df = df.pivot_table(index=["id1", "id2"], 
                        columns="property", 
                        values="value",
                        aggfunc=' & '.join)  
    print (df)
    property        p
    id1 id2          
    1   2     v1 & v2
    

    Multiindex 的最后一个列添加 DataFrame.rename_axis 用于删除列名称和 DataFrame.reset_index

    df = df.pivot_table(index=["id1", "id2"], 
                        columns="property", 
                        values="value",
                        aggfunc=' & '.join).rename_axis(None, axis=1).reset_index()
    print (df)
       id1  id2        p
    0    1    2  v1 & v2
    

    【讨论】:

    • 谢谢!但由于数据框中只有一行,它试图聚合什么?
    • @tok - 因为pivot_table 总是聚合,pivot 不是函数。
    • 你能解释一下吗?在这种情况下 rename_axis 和 reset_index 做了什么?
    • @tok - 当然,rename_axis 删除 property - 它是列元信息,然后 reset_index 将具有级别 id1id2 的 MultiIndex 转换为列
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2021-02-11
    相关资源
    最近更新 更多