python-3.x - 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
先感谢您!
解决方案
您可以将数据框索引设置为 column B
,这样我们可以reindex
稍后使用它来填充每个组的缺失分类值。使用groupby
columnA
并选择 column C
,然后应用reindex
前面提到的函数,现在使用所需的类别序列。之后,用于reset_index
将索引 (A
和B
) 插入回数据框列中。
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
推荐阅读
- django - 如何覆盖 PasswordResetConfirmView?(django.contrib.auth.views)
- vue.js - 无法让 vue2-transitions 包工作
- groovy - 在 nifi 中如何使用 groovy 脚本调用休息服务
- angular - 角度表行包含使用反应形式动态地列的总和
- java - Java:如何用另一个drawable在ImageView中过度绘制现有的drawable?
- wordpress - 如何更改 wordpress 主题的所有按钮、图标和其他元素颜色?
- html - .router-link-active 在 vue css 中不起作用
- mysql - 数据流 Mysql 到 Bigquery:连接被拒绝
- linux - Linux 中的 IntelliJ 快捷方式约定
- html - 如何修复具有 display: flex 属性的引导行元素,阻止我的页面在浏览器上显示