pandas---数据处理(excel文件)

news/2024/7/21 3:51:42 标签: pandas, excel, python

近期在弄一个项目的前期数据,所以总结了一下,内容如下(以下以csv文件为例)

  • 1. DataFrame常用操作
    • 1.1 DataFrame去除空行
      • (1)对于一般空行
      • (2)对于列表式(list)空行
    • 1.2 数据的填充
      • (1)表格中填充0
    • 1.3 数据的删除
      • (1)DataFrame获取某一列的数据并去重
      • (2)删除指定行(某列包含某些特定值的行)
      • (3)删除指定列
      • (4)删除多行(某行中单元数据存在重复值)
      • (5)删除多行(按多列条件删除多行)
    • 1.4 数据的获取及筛选
      • (1)获取某一行某一列的数据值
      • (2)以某一列为比较条件的所有行
      • (3)按组别筛选出每一种数据
      • (4)多条件筛选数据
      • (5)数据的排序及分组(先排序,后分组)
    • 1.5 数据的插入
      • (1)数据的插入(一列)
      • (2)数据的插入(多列)
      • (3)实现数据分隔并换列插入存储
      • (4)实现DataFrame的if else判断,并将生成的数据插入表格
      • (5)多重条件&多where嵌套,并将生成的数据插入表格
    • 1.6 数据的修改
      • (1)列数据的替换
      • (2)按照某一列的值更改另一列的值
      • (3)根据判断条件来更换表格中数据的值
    • 1.7 数据的后期处理
      • (1)实现两表的拼接
      • (2)按某一字段排序
      • (3)重置索引
  • 2. 日期
    • 2.1 计算两个日期间的总天数
    • 2.2 日期的递增,类别的联合表格生成
    • 2.3 按时间递增生成数据

1. DataFrame常用操作

1.1 DataFrame去除空行

(1)对于一般空行

python">### 删掉空行
data_use=data_use[~(data_use['elec_ap'].isnull())]
## 法2
df = df[df['A'] != 0]
## 法3
machine_name_time = 'machine_name'
data.dropna(subset=[machine_name_time],inplace=True)
## 法4
### 去空,inplace=True才会修改原表格的数据,否则并不会修改原表格的数据
data_use.dropna(how='any', axis=0,inplace=True)

(2)对于列表式(list)空行

python">### 现将表格中为  []  的值变为NaN
## df['value'] = df['value'].str[0] 可去掉空值行,但会将第一列数据变为该行数组元素的第一个元素
##可借助辅助列(value_2),后再删除该辅助列,也可以直接if判断操作
df['value_2'] = df['value'].str[0]
### 再去除有空行存在的列,必须加inplace=True,否则原数据并不会改变
df.dropna(inplace=True)

第一步
第二步
第三步

1.2 数据的填充

(1)表格中填充0

python">merge_group = merge_group.fillna(0)
merge_group

表格中填充0

1.3 数据的删除

(1)DataFrame获取某一列的数据并去重

python">### 获取电器设备一栏并去重
result = data['elec_ap'].unique()

DataFrame列数据去重

(2)删除指定行(某列包含某些特定值的行)

python">##df.drop([0],axis=1)
data.drop(data[data['elec_aps']=='电冰箱'].index,axis=0,inplace=True)
data

删除指定列

(3)删除指定列

python">df.drop(["one"],axis=1)

删除指定列

(4)删除多行(某行中单元数据存在重复值)

python">### 用于装重复的行下标
same_datas = []
for index, row in data_c.iterrows():     
    row_lists=list(row)
    #print(index,row_lists)
    ## 用来判断,防止每行单元数据重复
    values = []
    flag = True
    for value in row:
        if value in values:
            flag = False
        else:
            values.append(value)
    if flag == False:
        same_datas.append(index)
# 将存在重复单元格的行从data中去除
data.drop(same_datas,inplace=True)

(5)删除多行(按多列条件删除多行)

python">## 删除多列
df.drop_duplicates(subset=['a', 'b'], keep='first', inplace=False)

1.4 数据的获取及筛选

(1)获取某一行某一列的数据值

python">for index in range(0,len(itemSet_between_more)):
	num = itemSet_between_more.iloc[index]['数量']
	print(num)
	#itemSet_between_more如下图

itemSet_between_more表格
获取的数据

(2)以某一列为比较条件的所有行

python">data_A = data_use[data_use['degree']=='A']
data_A

找出某一列满足某条件的所有行

(3)按组别筛选出每一种数据

python">### 注意:elec_aps是一个[],elec_ap是DataFrame中的列数据
for index in range(0,len(elec_aps)):
    ### 获取某一行数据
    data_per = data[data['elec_ap']==elec_aps[index]]
    print(data_per)

按种类分组

(4)多条件筛选数据

python">keys = ['T0.00', 'T01.00', 'T02.00', 'T03.00']
data_between = data_use.loc[(data_use[keys[1]] > 1)|(data_use[keys[3]] > 1)]
data_between

多条件筛选数据

(5)数据的排序及分组(先排序,后分组)

说明:防止分组后同样的数据顺序不一致,导致数据误差

python"> ##按日期分组获取列表
 ### 先以elec_ap列实现排序,放置数据乱序
    item_single_list = data_use.sort_values(
        'elec_ap',ascending=False
    ).groupby(
        by='rq'
    ).apply(
        lambda x:list(x.elec_aps)
    )

1.5 数据的插入

(1)数据的插入(一列)

python">data.insert(loc=2,column='degree',value='A')
### 参数说明:
loc:插入的位置
column:插入列的名字,多列:column=['列名_A','列名_B']
value:插入的值(value=列A,列A=[......]),多列:value=[列A,列B]

(2)数据的插入(多列)

python">## type(y_machine_label):list(12),type(y_powers):list(15*12)
for i in range(len(y_machine_label)):
    df[y_machine_label[i]]=y_powers[i]

(3)实现数据分隔并换列插入存储

python">elec_aps = []
for item in data_use['elec_ap']:
    #print(item.split('_')[-1])
    elec_aps.append(item.split('_')[-1])
### df.replace(to_replace, value) 前面是需要替换的值,后面是替换后的值。
data_use.insert(loc=2,column='elec_aps',value=elec_aps)
data_use

数据分隔并换列存储

插入前数据
插入后数据

(4)实现DataFrame的if else判断,并将生成的数据插入表格

python">data_use[item] = np.where(data_use[key_use[index]]>1, 
                     "["+data_use['elec_aps'].map(str) + "," + str((index+1)*2-1)+"]","")
说明:
data_use[新增的列名] = np.where(原列表判断条件, 表达式1,表达式2)
根据判断条件对数据进行判断,符合则表达式1,否知则表达式2,并将该值赋给表格新增列

DataFrame的if/else

(5)多重条件&多where嵌套,并将生成的数据插入表格

python">data_use["test_time"] = np.where((data_use["elec_time_T01.00"]!="")&(data_use["elec_time_T03.00"]!=""),
                        data_use["elec_time_T01.00"].map(str) + "," + data_use["elec_time_T03.00"].map(str), 
                        np.where(data_use["elec_time_T01.00"]!="",data_use["elec_time_T01.00"].map(str),data_use["elec_time_T03.00"].map(str)
              )
    )

多where嵌套

1.6 数据的修改

(1)列数据的替换

python">### 直接在原列名上修改即可
data['基于'] = items_A
data

(2)按照某一列的值更改另一列的值

### 根据data_use['elec_ap']列的值进行判断,来改变data_use['degree']的值,并把值赋给data_use['degree']列
### data_use['degree'].mask(data_use['elec_ap'] == '湖北_樱桃_B', 'B') 并不会改变原表格数据的值
data_use['degree'] = data_use['degree'].mask(data_use['elec_ap'] == '湖北_樱桃_B', 'B')
data_use['degree'] = data_use['degree'].mask(data_use['elec_ap'] == '湖北_苹果_E', 'B')

根据某一条件更改另一处的值

(3)根据判断条件来更换表格中数据的值

python">keys = ['rydl', 'T0.00', 'T01.00', 'T02.00','T03.00']
### 此处阈值为1,根据阈值来实现数据的替换
for item_time in keys:
    data_use.loc[data_use[item_time]>=1,item_time] = 1
    data_use.loc[data_use[item_time]<1,item_time] = 0

根据条件更换数值

1.7 数据的后期处理

(1)实现两表的拼接

python">### 注意:需要两个表的列名一致,才会进行值比较并且拼接
### 若不一致,则会根据便利原则,将不同列之间的值进行一次拼接
merge_group = pd.merge(A_machine,my_data,how="left")
merge_group
## 扩展
keys = ['elec_time_T01.00','elec_time_T03.00] #为将从表格中去除的列名
data_tt.drop(keys, axis=1).join(df_2)

表格间拼接

(2)按某一字段排序

python">###表示pd按照xxx这个字段排序,inplace默认为False,如果该值为False,那么原来的pd顺序没变,只是返回的是排序的
result_low.sort_values("置信度",inplace=True,ascending=False)
result_low

(3)重置索引

python">## 按置信度从高到低排序
### drop=True, 删除原有索引,建立新索引, drop = False 保留原有索引,添加重置索引。
result_low.reset_index(drop=True, inplace=True)
result_low

2. 日期

2.1 计算两个日期间的总天数

python">### 计算总日期
import datetime
d1 = datetime.datetime(2019,3,4) # 第一个日期
d2 = datetime.datetime(2019,11,30) # 第二个日期
interval = d2 - d1 # 两日期差距
interval.days # 具体的天数

两日期间隔时间

2.2 日期的递增,类别的联合表格生成

python"># 指定开始日期是2019/03/04,指定结束日期为2019/11/30
import datetime
date_start = datetime.date(2019,3,4)
# 指定需要加(减)的天数
delta = datetime.timedelta(days = 1)
n_days = date_start
### 生成设备类别
elec = ['A', 'B', 'C', 'D', 'E']
rqs = []  #用于记录日期
elec_aps = []  #用于记录设备
while n_days.strftime('%Y/%m/%d')!='2019/11/30':
    # 每次以 前一天的日期 为基础累加一天
    n_days = n_days + delta
    #print(n_days.strftime('%Y/%m/%d'))
    for value in elec:
        rqs.append(n_days.strftime('%Y/%m/%d'))
        elec_aps.append(value)
## 将rqs,elec_aps数据生成表格
A_data = pd.DataFrame({
    'rq':rqs,
    'elec_aps':elec_aps
})
A_data 

表格生成

2.3 按时间递增生成数据

python">import pandas as pd 
#20171231 12:50时间点开始,生成以月为间隔,长度为5的时间段 
tm_rng = pd.date_range('20171231 12:50',periods=5,freq='M') 
 
print(type(tm_rng)) 
DatetimeIndex(['2017-12-31 12:50:00', '2018-01-31 12:50:00','2018-02-28 12:50:00', '2018-03-31 12:50:00',

http://www.niftyadmin.cn/n/341294.html

相关文章

【深度学习_TensorFlow框架】张量基础操作

写在前面 本篇文章主要讲解TensorFlow的一些基础概念以及基础操作&#xff0c;作为初学者&#xff0c;文章内容难免有错误&#xff0c;各位看官发现错误&#xff0c;还请不吝指正&#xff01;&#xff01;&#xff01;&#x1f91d; 基础数据类型以及了解张量的含义 张量的创…

最新整理Java面试八股文,大厂必备神器

在看这篇文章之前&#xff0c;我想我们需要先搞明白八股文是什么&#xff1f;&#xff1f;&#xff1f; 明清科举考试的一种文体&#xff0c;也称制义、制艺、时文、八比文。八股文章就四书五经取题&#xff0c;内容必须用古人的语气&#xff0c;绝对不允许自由发挥&#xff0…

带拉绳的按钮

看看效果&#xff1a; 再上代吗&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"https://unpkg.co/gsap3/dist/gsap.min.js"></scr…

入驻QQ一天就爆满,Midjourney中文版来了

目录 官方中文版上线&#xff0c;名额有限官方教程&#xff0c;详细可查社区内的优秀作品花式鼓励优秀创作者为你的创作保驾护航国内模式&#xff1a;当然少不了付费国内用户实现快速访问快去体验吧&#xff0c;「折腾没有消失&#xff0c;只是转移到了你的身上…」 国内用户终…

kali中间人攻击-渗透测试察打一体(8)

服务器攻击包含:中间人攻击,漏洞评估,漏洞利用,利用电子邮件系统的漏洞,暴力破解攻击,破解密码,内容较多本篇只讲中间人攻击和演示。 往期系列文章 Metasploit基础和实操-渗透测试察打一体(7)_luozhonghua2000的博客-CSDN博客 Metasploit命令参考列表-渗透测试察打一体…

人工智能的界面革命,消费者与企业互动的方式即将发生变化。

本文来源于 digitalnative.substack.com/p/ais-interface-revolution 描述了一种社会现象&#xff1a; 随着真实友谊的减少和虚拟友谊的增加&#xff0c;越来越多的人开始将AI聊天机器人视为自己的朋友&#xff0c;甚至建立了深厚的情感纽带。这可能与当前人们越来越孤独的现实…

Linux RTC 驱动实验

RTC 也就是实时时钟&#xff0c;用于记录当前系统时间&#xff0c;对于 Linux 系统而言时间是非常重要的&#xff0c; 就和我们使用 Windows 电脑或手机查看时间一样&#xff0c;我们在使用 Linux 设备的时候也需要查看时 间。 一、Linux 内核 RTC 驱动简介 RTC 设备驱动是标准…

保护你无价的数据 | 推荐一个开源备份工具,可去重、增量、压缩、还原到特定日期...

Borg 数据备份 Borg 的优势是 高效&#xff1a;BorgBackup 会将文件按数据块去重&#xff0c;只有改动的数据块才会被备份。一个 25 GiB 的虚拟机磁盘文件&#xff0c;只改动了 1 GiB&#xff0c;那就只会新增备份这 1 GiB 的数据&#xff1b;高速&#xff1a;核心算法使用 C 编…