首页 > 解决方案 > Pandas:分类列和每个类别的行插入

问题描述

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

假设以下数据框 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.xpandasdataframecategorical-data

解决方案


您可以将数据框索引设置为 column B,这样我们可以reindex稍后使用它来填充每个组的缺失分类值。使用groupbycolumnA并选择 column 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

推荐阅读