python 字段错位的处理
需要解决的问题:
import pandas as pd
import numpy as npdf = pd.DataFrame([[1,np.nan,3],[4,5,6],[7,np.nan,9]],columns=['A','B','C'])
print(df)
怎样将0、2行 B 、C列数值替换A、B 两列的数值 (即数据左移一列)?
一、方法介绍
所使用的方法:将需要错位的数据块筛出构造新表,采用2表 更新的方式
(一)、错位块的处理方式(将错位的地方换回来)
1、整列赋值的方式【强烈建议】
df1 = df.copy()
df1
temp = df1.loc[[0,2],] # df.loc[],是根据行列的名字来选择
temp
处理过程:
# 将C列内容赋值给B列,C列用np.nan填充
for i,j in enumerate(temp.columns):if i>0: # 从第2列起,开始错位temp.iloc[:,i] = temp.iloc[:,i+1] # 将后一列内容赋值给前一列temp.iloc[:,i+1] = np.nan # # 将最后一列用np.nan填充if i==len(temp.columns)-2: # 当遍历到最后一列时,结束循环breaktemp
2、取全部数据,删除多余空列,添加一列nan,重命名,更新原表【建议】
df1_2 = df.copy()
df1_2
temp1_2 = df1_2[df1_2['B'].isna()]
temp1_2
处理过程:
temp1_2 = temp1_2.drop(columns=['B']) # 删除错位开始的“B”列
temp1_2
temp1_2['add'] = np.nan # 最后添加一列,用np.nan来填充
temp1_2
temp1_2 = pd.DataFrame(temp1_2.values, index=temp1_2.index, columns=df1_2.columns) # 重新构造DataFrame
temp1_2
3、取b、c列,添加一列nan,重命名,更新原表
df3 = df.copy()
df3
temp3 = df1.iloc[[0,2],] # df.iloc[],是根据行列的位置顺序来选择【有时行索引为2,但位置顺序为1,注意与df.loc[]的区别】
temp3
处理过程:
temp3 = temp3.loc[:,'B':] # 错位开始的“B”列及之后的列
temp3
temp3['add'] = np.nan # 最后添加一列,用np.nan来填充
temp3
temp3 = pd.DataFrame(temp3.values, index=temp3.index, columns=df3.columns) # 重新构造DataFrame
temp3
temp3 = temp3.drop(columns = ['A']) # 删除temp3中未错位的列
temp3
(二)、更新原数据的方式
1、运用等号赋值:“=”【建议】
df1 = df.copy()
df1
temp
df1[df1['B'].isna()]=temp # 等号左边只能用df1[df1['B'].isna()]的形式
df1# ps: 等号左边以df.loc()、df.iloc()、df.iloc[0:1] 都形式会报错,如:df1.loc[[0,2],] = temp 会报错
注意:等号赋值时,需要进行整行的赋值操作。若等号右边只是行的一部分切片列,那么没出现的列,左边的会显示为缺失值:np.nan
例如:
df1 = df.copy()
df1
df1[df1['B'].isna()]
temp.loc[:,'B':'C'] # 等号右边只是行的一部分切片列:B、C列
df1[df1['B'].isna()] = temp.loc[:,'B':'C']
df1 # 可以看到原来A列的 1、7,全部改成了缺失值:nan,因为等号右边对应行索引的的位置,没有A列内容
总结:使用等号:“=” 赋值时,必须整行整行的赋值。
2、运用:df.update() 来更新数据
df2 = df.copy()
df2
temp2 = temp.copy()
temp2
type(temp2.loc[0,'C'])
# 1、正确的操作
# 1)先把temp2的字段 全转换成字符型
temp2 = temp2.astype('str')
# 2)运用update
df2.update(temp2) # update会直接在原数据的基础上更新数据
# 3)最后按需求将字符的nan 替换成np.nan
df2 = df2.replace('nan',np.nan)print(df2,'\n------')
print(df2.loc[0,'C'], type(temp.loc[0,'C']))
# 2、错误的操作:不先改变缺失值nan的类型,直接运用update。此时缺失值nan不能覆盖原来的数据
print(temp2.loc[0,'C'], type(temp2.loc[0,'C']), '\n----')
df2.update(temp2)
df2
总结:
- 1、与等号:“=”对比df.update()不要求整行,只对对应位置进行数据的更新(行索引,列索引相同的位置)
- 2、注意,使用df.update()时,缺失值nan不能覆盖原来的数据。可以先转换为字符型,更新后再转回需要的格式
3、运用:df.combine_first() 来更新数据
df3 = df.copy()
df3
temp3 = temp.copy()
temp3
# 1、正确的操作
# 1)先把temp3的字段 全转换成字符型
print(temp3.loc[0,'C'], type(temp3.loc[0,'C']),'\n------')
temp3 = temp3.astype('str')
print(temp3.loc[0,'C'], type(temp3.loc[0,'C']),'\n------')# 2)运用combine_first
temp3.combine_first(df3) # 【temp3和地方相同位置存在元素时,会优先保留temp3的数据】combine_first不会直接在原数据的基础上更新数据# 3)最后按需求将字符的nan 替换成np.nan
df3 = df3.replace('nan',np.nan)print(df2,'\n------')
print(df2.loc[0,'C'], type(temp.loc[0,'C']))
# 2、错误的操作:不先改变缺失值nan的类型,直接运用combine_first。此时会覆盖原来的缺失值nan
print(temp3.loc[0,'C'], type(temp3.loc[0,'C']), '\n----')
temp3.combine_first(df3)
(二)、错位处理案例
path = r'C:\Users\...\Desktop\read_test\订单信息.csv'
order = pd.read_csv(path ,delimiter=',',encoding = 'UTF-8',skip_blank_lines=True,header=0) # 跳过空行,第一行为标题行,编码为utf-8
order.tail() # 后面几行(699995:699997行)<订单类型>列有错位
# 单独查看错位的行
order[order['订单类型'].isna()]
# 将需要错位的行单独筛选出来处理temp = order[order['订单类型'].isna()]for i,j in enumerate(temp.columns):if i>0:temp.iloc[:,i] = temp.iloc[:,i+1]temp.iloc[:,i+1] = np.nanif i==len(temp.columns)-2:break
temp
# 对原数据利用等号的方式重新赋值
order[order['订单类型'].isna()] = temp
order.tail()
——————
此时,利用pandas以将错位的行调整完毕
python 字段错位的处理相关推荐
- arcgis python字段计算器_ArcGIS 字段计算器 Python 坑
最近要处理个简单数据,一个字段中为文本类型,包含各种描述.要求是包含平方米的数值提取出来,变成数值,如果包含多个,则把各个值累加起来. 比如 字段值为 "非法占用100平方米" 处 ...
- arcgis python字段计算器_计算字段示例—帮助 | ArcGIS for Desktop
使用键盘输入值并不是编辑表中值的唯一方式.在某些情况下,为了设置字段值,可能要对单条记录甚至是所有记录执行数学计算.您可以对所有记录或选中记录执行简单计算和高级计算.此外,还可以在属性表中的字段上计算 ...
- arcgis用python字段自动编号,arcgis中字段自动编号的两种方法
<arcgis中字段自动编号的两种方法>由会员分享,可在线阅读,更多相关<arcgis中字段自动编号的两种方法(4页珍藏版)>请在人人文库网上搜索. 1.精选文档关于ARCGI ...
- python 字段升序,python 根据两个字段排序, 一个升序, 一个降序
SSL双向认证java实现(转) 本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要, ...
- python 字段升序,在Python中按键或值按升序和降序对字典排序
问题陈述:编写一个Python程序以按键或值对字典进行排序(升序和降序). 示例 Input: dictionary = {'carl':40,'alan':2,'bob':1,'danny':3} ...
- 基于arcgis的python字段计算器_arcgis字段计算器
draw9的使用说明 转载来自:http://isux.tencent.com/android-ui-9-png.html 在Android的设计过程中,为了适配不同的手机分辨率,图片大多需要拉伸或者 ...
- python fetchall方法_Python连接MySQL并使用fetchall()方法过滤特殊字符
来一个简单的例子,看Python如何操作数据库,相比Java的JDBC来说,确实非常简单,省去了很多复杂的重复工作,只关心数据的获取与操作. 准备工作 需要有相应的环境和模块: Ubuntu 14.0 ...
- python 基础语法练习回顾
#!/usr/bin/python# -*- coding: UTF-8 -*-import timeimport calendar student = {"age": 7,&qu ...
- Python基础教程(十三):JSON、练习题100题
Python JSON 本章节我们将为大家介绍如何使用 Python 语言来编码和解码JSON 对象. 环境配置 在使用 Python 编码或解码 JSON 数据前,我们需要先安装 JSON 模块.本 ...
最新文章
- 如何用 Slack 和 Kubernetes 构建一个聊天机器人?| 附代码
- mysql教程日志_mysql日志文件的详细说明
- 《排序算法系列一、简单选择排序》
- anaconda使用方法
- ubuntu c++ 实现自动回车键功能_特斯拉已实现完全自动驾驶功能?是噱头还是技术的突破?...
- linux替换文件内容cat,Linux下巧用cat与EOF实现文件的替换和追加
- App设计灵感之十二组精美的天气预报App设计案例
- 为什么在大型 Angular 应用里我们需要使用 ngrx
- 前端学习(2354):image组件的基本使用
- 和 Python 2.x 说再见!
- 工欲善其事必先利其器,TI-ONE平台“实操手册”在这里!
- MVC利用Routing实现多域名绑定一个站点、二级域名以及二级域名注册Area
- java多线程 - 线程通信
- 一个小时,零基础入门,看完这篇30行代码 教你实现百度换肤!
- log10/log2--求常用对数/以2为底的对数
- 网站PV,UV是什么意思?
- 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界:光照与材质专场
- 怎样设置和使用speedceo?简洁浏览器的使用分享
- mac上通过自动操作达到右键通过vscode打开文件、文件夹
- 图片补全《Globally and locally consistent image completion》