【问题标题】:How to pivot one column containing strings in a dataframe? [duplicate]如何在数据框中旋转包含字符串的一列? [复制]
【发布时间】:2018-08-08 05:52:40
【问题描述】:

我正在尝试通过将数据中的一列转换为行(通过旋转或取消堆叠)来重塑熊猫数据框。

我对此很陌生,很可能我遗漏了一些明显的东西。我进行了广泛的搜索,但未能成功应用我遇到的任何解决方案。

df
    Location    Month       Metric       Value
0   Texas       January     Temperature  10
1   New York    January     Temperature  20
2   California  January     Temperature  30
3   Alaska      January     Temperature  40
4   Texas       January     Color        Red
5   New York    January     Color        Blue
6   California  January     Color        Green
7   Alaska      January     Color        Yellow
8   Texas       February    Temperature  15
9   New York    February    Temperature  25
10  California  February    Temperature  35
11  Alaska      February    Temperature  NaN
12  Texas       February    Color        NaN
13  New York    February    Color        Purple
14  California  February    Color        Orange
15  Alaska      February    Color        Brown

我正在尝试将度量值“透视”到列中。最终目标是这样的结果:

Location    Month     Temperature   Color
Texas       January   10            Red
New York    January   20            Blue
California  January   30            Green
Alaska      January   40            Yellow
Texas       February  15    
New York    February  25            Purple
California  February  35            Orange
Alaska      February                Brown

我尝试过使用 pivot、pivot_table 以及 unstack 方法,但我确信我遗漏了一些东西。许多复杂性似乎是因为我将字符串与数字混合在一起,并且数据中也有一些缺失值。

这是迄今为止我能得到的最接近的值,但我不希望月份列有额外的行,从而导致更多的空白值:

df.set_index(['Location','Month','Metric'], append=True, inplace=True)
df.unstack()

    Value
    Metric              Color   Temperature
    Location    Month       
0   Texas       January None    10
1   New York    January None    20
2   California  January None    30
3   Alaska      January None    40
4   Texas       January Red     None
5   New York    January Blue    None
6   California  January Green   None
7   Alaska      January Yellow  None

这里的任何帮助将不胜感激。这似乎很可能有一个简单的解决方案可用。

【问题讨论】:

    标签: python python-3.x pandas pivot pivot-table


    【解决方案1】:

    为了正确排序,首先将列Month 转换为ordered categorical,然后通过set_indexunstack 重塑:

    #add another months
    cats = ['January','February']
    df['Month'] = pd.Categorical(df['Month'], categories=cats, ordered=True)
    

    或者,如果月份在原始列中排序,谢谢@ason​​gtoruin:

    df['Month'] = pd.Categorical(df['Month'], categories=df['Month'].unique(), ordered=True)
    

    df = (df.set_index(['Location','Month','Metric'])['Value']
           .unstack()
           .reset_index()
           .rename_axis(None, axis=1)
           .sort_values('Month'))
    print (df)
         Location     Month   Color Temperature
    0      Alaska   January  Yellow          40
    2  California   January   Green          30
    4    New York   January    Blue          20
    6       Texas   January     Red          10
    1      Alaska  February   Brown         NaN
    3  California  February  Orange          35
    5    New York  February  Purple          25
    7       Texas  February     NaN          15
    

    【讨论】:

    • pd.Categorical(df['Month'], categories=df['Month'].unique(), ordered=True) 的灵活性如何?
    • @ason​​gtoruin - 好主意,谢谢。
    • @ason​​gtoruin,如果Month 包含此问题中的字符串,则会对月份名称施加字典(字母)顺序,这通常是不希望的。您必须手动编码正确的月份顺序,或import calendar 并使用calendar.month_name编辑: 没关系,我误以为pd.Categorical(df['month'].unique(), ordered=True)
    • @PeterLeimbigler 是的,您是正确的 - 使用 .unique() 可确保您始终捕获每个可用的月,但不一定保留日历顺序。我猜这取决于对 OP 更重要的是什么。
    • 谢谢。对我来说,pivot_table 方法似乎更简单。在这里使用 unstack 有什么好处?还是只是偏好?
    【解决方案2】:

    满足您需求的关键解决方案。输出是你想要的语义 -

    Metric                Color Temperature
    Location   Month                       
    Alaska     February   Brown         NaN
               January   Yellow          40
    California February  Orange          35
               January    Green          30
    New York   February  Purple          25
               January     Blue          20
    Texas      February     NaN          15
               January      Red          10
    

    代码 -

    df_p = df.pivot_table(index=['Location', 'Month'], columns=['Metric'], values='Value', aggfunc=np.sum)
    

    【讨论】:

    • 非常感谢!对我(初学者)来说,这似乎是最直接的解决方案。不过,与其他人建议的那样,与使用 unstack 相比,有兴趣了解这种方法是否有任何缺点。另外,我添加了以下内容,以便以我需要的格式输出: df_p.reset_index().rename_axis(None, axis=1)
    猜你喜欢
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2015-04-16
    相关资源
    最近更新 更多