【问题标题】:Pandas: categorical column and insertion of rows for every categoryPandas:分类列和每个类别的行插入
【发布时间】:2021-02-10 10:42:44
【问题描述】:

我似乎无法实现插入缺失值的行,同时将一列作为分类。

假设以下数据框 df,其中 B 列是分类的,类别应按“d”、“b”、“c”、“a”的顺序出现。

df= pd.DataFrame({'A':['i', 'i', 'i', 'j', 'k'], \
                  'B':pd.Categorical(['d', 'c', 'b','b', 'a'], \
                                     categories= ['d', 'b', 'c', 'a'], \
                                     ordered=True), \
                  'C':[1, 0, 3 ,2, np.nan]})

我需要将df转换成如下格式:

   A  B    C
 0  i  d  1.0
 1  i  b  0.0
 2  i  c  3.0
 3  i  a  NaN
 4  j  d  NaN
 5  j  b  2.0
 6  j  c  NaN
 7  j  a  NaN
 8  k  d  NaN
 9  k  b  NaN
10  k  c  NaN
11  k  a  NaN

提前谢谢你!

【问题讨论】:

    标签: python-3.x pandas dataframe categorical-data


    【解决方案1】:

    您可以将数据框索引设置为列B,这样我们以后可以使用reindex 来填充每个组缺失的分类值。使用groupbyA 并选择C 列,然后如前所述应用reindex 函数,现在使用所需的类别序列。然后,使用reset_index 将索引(AB)插入数据框列。

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'A':['i', 'i', 'i', 'j', 'k'], \
                      'B':pd.Categorical(['d', 'c', 'b','b', 'a'], \
                                         categories= ['d', 'b', 'c', 'a'], \
                                         ordered=True), \
                      'C':[1, 0, 3 ,2, np.nan]})
    print(df)
    
    df = df.set_index('B')
    df = df.groupby('A')['C']\
            .apply(lambda x: x.reindex(['d', 'b', 'c', 'a']))\
            .reset_index()
    
    df.B = pd.Categorical(df.B)
    print(df)
    

    df的输出

        A  B    C
    0   i  d  1.0
    1   i  b  3.0
    2   i  c  0.0
    3   i  a  NaN
    4   j  d  NaN
    5   j  b  2.0
    6   j  c  NaN
    7   j  a  NaN
    8   k  d  NaN
    9   k  b  NaN
    10  k  c  NaN
    11  k  a  NaN
    

    【讨论】:

    • 非常感谢您的回复。我会回到我原来的数据集试试这个!
    猜你喜欢
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多