需要解决的问题:

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 字段错位的处理相关推荐

  1. arcgis python字段计算器_ArcGIS 字段计算器 Python 坑

    最近要处理个简单数据,一个字段中为文本类型,包含各种描述.要求是包含平方米的数值提取出来,变成数值,如果包含多个,则把各个值累加起来. 比如 字段值为 "非法占用100平方米" 处 ...

  2. arcgis python字段计算器_计算字段示例—帮助 | ArcGIS for Desktop

    使用键盘输入值并不是编辑表中值的唯一方式.在某些情况下,为了设置字段值,可能要对单条记录甚至是所有记录执行数学计算.您可以对所有记录或选中记录执行简单计算和高级计算.此外,还可以在属性表中的字段上计算 ...

  3. arcgis用python字段自动编号,arcgis中字段自动编号的两种方法

    <arcgis中字段自动编号的两种方法>由会员分享,可在线阅读,更多相关<arcgis中字段自动编号的两种方法(4页珍藏版)>请在人人文库网上搜索. 1.精选文档关于ARCGI ...

  4. python 字段升序,python 根据两个字段排序, 一个升序, 一个降序

    SSL双向认证java实现(转) 本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要, ...

  5. python 字段升序,在Python中按键或值按升序和降序对字典排序

    问题陈述:编写一个Python程序以按键或值对字典进行排序(升序和降序). 示例 Input: dictionary = {'carl':40,'alan':2,'bob':1,'danny':3} ...

  6. 基于arcgis的python字段计算器_arcgis字段计算器

    draw9的使用说明 转载来自:http://isux.tencent.com/android-ui-9-png.html 在Android的设计过程中,为了适配不同的手机分辨率,图片大多需要拉伸或者 ...

  7. python fetchall方法_Python连接MySQL并使用fetchall()方法过滤特殊字符

    来一个简单的例子,看Python如何操作数据库,相比Java的JDBC来说,确实非常简单,省去了很多复杂的重复工作,只关心数据的获取与操作. 准备工作 需要有相应的环境和模块: Ubuntu 14.0 ...

  8. python 基础语法练习回顾

    #!/usr/bin/python# -*- coding: UTF-8 -*-import timeimport calendar student = {"age": 7,&qu ...

  9. Python基础教程(十三):JSON、练习题100题

    Python JSON 本章节我们将为大家介绍如何使用 Python 语言来编码和解码JSON 对象. 环境配置 在使用 Python 编码或解码 JSON 数据前,我们需要先安装 JSON 模块.本 ...

最新文章

  1. 如何用 Slack 和 Kubernetes 构建一个聊天机器人?| 附代码
  2. mysql教程日志_mysql日志文件的详细说明
  3. 《排序算法系列一、简单选择排序》
  4. anaconda使用方法
  5. ubuntu c++ 实现自动回车键功能_特斯拉已实现完全自动驾驶功能?是噱头还是技术的突破?...
  6. linux替换文件内容cat,Linux下巧用cat与EOF实现文件的替换和追加
  7. App设计灵感之十二组精美的天气预报App设计案例
  8. 为什么在大型 Angular 应用里我们需要使用 ngrx
  9. 前端学习(2354):image组件的基本使用
  10. 和 Python 2.x 说再见!
  11. 工欲善其事必先利其器,TI-ONE平台“实操手册”在这里!
  12. MVC利用Routing实现多域名绑定一个站点、二级域名以及二级域名注册Area
  13. java多线程 - 线程通信
  14. 一个小时,零基础入门,看完这篇30行代码 教你实现百度换肤!
  15. log10/log2--求常用对数/以2为底的对数
  16. 网站PV,UV是什么意思?
  17. 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界:光照与材质专场
  18. 怎样设置和使用speedceo?简洁浏览器的使用分享
  19. mac上通过自动操作达到右键通过vscode打开文件、文件夹
  20. 图片补全《Globally and locally consistent image completion》

热门文章

  1. 扎心的hanlp的安装过程
  2. 醛基化改性交联聚苯乙烯微球载金属卟啉/交联聚苯乙烯微球载吡啶基卟啉的研究
  3. iPhone For Dummies, 12th Edition 免积分下载
  4. Qt扫盲-QLabel使用总结
  5. char php,php版本的charCodeAt()函数
  6. FPGA学习之latch的产生原因、危害与避免措施
  7. 【一个让你停不下来的动效】——难道不来瞅瞅?(含源码+思路)
  8. TTL以及LVDS接口传输
  9. 【无标题】免费版 基础实验(答案)
  10. 必须学会看官方的英文文档资料等