Python数据处理:筛选、统计、连表、拼接、拆分、缺失值处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据处理:筛选、统计、连表、拼接、拆分、缺失值处理相关的知识,希望对你有一定的参考价值。

参考技术A file1_path ='E:/Users/lenovo/Desktop/中视/622召回.csv' # 源数据

格式:file1=pd.read_csv(file1_path)

pd.read_csv(file1_path,encoding='gbk')

pd.read_csv(file1_path,encoding='gbk',skiprows=[2,3])

pd.read_csv(file1_path,encoding='gbk',skiprows=lambda x:x%2==1)

pd.read_csv(file1_path,encoding='gbk',keep_default_na=False)

new=pd.DataFrame()

new.new[[0,1,2]]

new.new[0:2]

查询结果同上

new.loc[new['激活数']>1000]

loc和iloc的区别:

     loc:纯标签筛选

     iloc:纯数字筛选

#筛选出new的某两列

new=new.loc[:,['phone','收件人姓名']]

#筛选new的第0,1列

new.iloc[:,[0,1]]

使用‘==’筛选-筛查“崔旭”的人(只能筛查指定明确的)

#new=file1.loc[(file1['收件人姓名']=='崔旭')|(file1['收件人姓名']=='崔霞')]

#print(new)

#使用loc函数筛选-str.contains函数-筛查名字中包含'亮'和'海'的人

#new=file1.loc[file1['收件人姓名'].str.contains('亮|海')]

#print(new)

#使用loc函数筛选-str.contains函数-筛查'崔'姓的人

#new=file1.loc[file1['收件人姓名'].str.startswitch('崔')]

#print(new)

df = df[(df['DEPOSIT_PAY_TIME_x'] .notnull() ) & (df['DEPOSIT_PAY_TIME_x'] != "" )]

print("during_time(number)=0的个数:",newdata[newdata['during_time(number)'] ==0].count()['during_time(number)'])

print("during_time(number)=1,2,3的个数:",newdata[(newdata['during_time(number)'] >0) & (newdata['during_time(number)'] <4)].count()['during_time(number)'])

print(newdata[newdata['during_time(number)'] ==0])

newdata[newdata['Team']. isin (['England','Italy','Russia'])][['Team','Shooting Accuracy']]

df.年龄.value_counts()

1.修改指定位置数据的值(修改第0行,’创建订单数‘列的值为3836)

new.loc[0,'创建订单数']=3836

2.替换‘小明’-‘xiaoming’

df.replace('name':'小明':'xiaoming')

3.批量替换某一列的值(把‘性别’列里的男-male,女-felmale)

方法一:df['性别']=df['性别'].map('男':'male','女':'female')

方法二:df['性别'].replace('female','女',inplace=True)

               或df['性别']=df['性别'].replace('female','女')                这就是inplace的作用

                +df['性别'].replace('male','男',inplace=True)

4.替换列索引

df.columns=['sex','name','height','age']

或者:df.rename(columns='性别':'sex','姓名':'name','身高':'height','年龄':'age')

5.删除某一列

del df['player']

6. 删除某一列(方法二),删除某一行(默认axis=0删除行,为1则删除列)

删除某一列(方法二)

df.drop('性别',axis=1)

删除某一行

df.drop(1,axis=0)

file1=pd.read_csv(file1_path)

file2=pd.read_csv(file2_path)

new1=pd.DataFrame()

new1['phone']=file1['phone']

new1['contact_time']=file1['contact_time']

new2=pd.DataFrame()

new2['phone']=file2['phone']

new2['submission_audit_time']=file2['提交审核时间']

newdata=pd.merge(new1,new2,on='phone',how='left')

df=pd.concat([df1,df2],axis=0)

4.2.2 横向表连接

df=pd.concat([df1,df2],axis=1)

df1['地区'].str.split('·',3,expand=True)

df1:

df1[['城市', '城区','地址']] = df1['地区'].str.split('·', 3, expand = True)

5.1 缺失值删除

data.dropna(axis=0,subset = ["Age", "Sex"])   # 丢弃‘Age’和‘Sex’这两列中有缺失值的行

data.dropna(how = 'all')    # 传入这个参数后将只丢弃全为缺失值的那些行

data.dropna(axis = 1)       # 丢弃有缺失值的列(一般不会这么做,这样会删掉一个特征)

data.dropna(axis=1,how="all")   # 丢弃全为缺失值的那些列

5.2 缺失值填充:pandas.DataFrame.fillna()函数

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

功能:使用指定方法填充NA/NaN值

其中inplace=True就是直接在原有基础上填满

5.3 缺失值查询:

缺失值数量查询:df.isnull().sum()

缺失值行查询:df[df.isnull().T.any()]

newdata['during_time']=pd.to_datetime(newdata['submission_audit_time'])-pd.to_datetime(newdata['contact_time'])

newdata['during_time(number)']=(pd.to_datetime(newdata['submission_audit_time'])-pd.to_datetime(newdata['contact_time'])).apply(lambda x: x.days)

new=pd.DataFrame()

new=newdata[newdata['during_time(number)'] ==0]

new.to_csv(save_path,encoding='utf-8-sig')

将数据按行拆分并存储到不同的csv文件中:

path='C:/Users/EDZ/Desktop/工作/2021.08.19/'

for i in range(0,30):

    df.loc[[i]].to_csv(path+str(i)+'.csv',encoding='gbk')

df = df[['购药日期', '星期','社保卡号','商品编码', '商品名称', '销售数量', '应收金额', '实收金额' ]]

python处理Excel实现自动化办公教学(数据筛选公式操作单元格拆分合并冻结窗口图表绘制等)

 相关文章:

python处理Excel实现自动化办公教学(含实战)【一】

python处理Excel实现自动化办公教学(含实战)【二】

python处理Excel实现自动化办公教学(数据筛选、公式操作、单元格拆分合并、冻结窗口、图表绘制等)【三】

1.数据筛选

样例:

from openpyx1. styles import Alignment
import openpyx1
wb =openpyxl.load workbook( './data/ cellBorder .xlsx')
sheet =wb[ '数据筛选']
#创建筛选器对象: auto_ filter
#ref:使得筛选器对象引用指定的区域
sheet.auto_filter.ref = 'B1:D7'
wb.save( './data/ cellBorder.xlsx' )
#设置筛选条件
from openpyx1. styles import Alignment
import openpyxl
wb = openpyxl.load workbook( ' . /data/ cellBorder .xlsx')
sheet=wb['数据筛选']

#创建筛选器对象: auto_ filter
#ref:使得筛选器对象引用指定的区域

sheet.auto_filter.ref ='B1:D7 '
#add_filter_column参数:参数1表示对指定区域那一列进行设置筛选条件,参数2: 筛选条件内容
sheet.auto_filter.add_filter_column(0,['北京','深圳'])
wb.save('./data/ cellBorder.xlsx')


#样式需要去excel里点击保存即可
#排序
from openpyxl. styles import Alignment
import openpyx1
wb = openpyxl.load workbook('. /data/ cellBorder .xlsx')
sheet = wb['数据筛选']
sheet.auto_filter.ref = 'B1:D7'
#参数1:排序列.参数2:升降序
sheet.auto_filter.add_sort_condition(ref= 'D2 :D9 ',descending=True)
wb.save('./data/ cellBorder . xlsx')

 2.公式

  • 利用 openpyxl 模块,用编程的方式在单元格中添加公式,就像 添加普通的值一样。例如:
    • sheet['B9'] = '=SUM(B1:B8)'
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
sheet['A1'] = 200
sheet['A2'] = 300
sheet['A3'] = '=SUM(A1:A2)'
wb.save('./data/sum.xlsx')

读取公式:

import openpyxl
wb = openpyxl.load_workbook( '.[data/sum.xlsx',read only=True)
sheet = wb.active
#注意:如果返回的是None,则打开exce1.工作簿,将内容手动保存下即可,不方便,但是没有办法
print(sheet[ 'A3' ] .value )

3.调整行列

  • 在 Excel 中,调整行和列的大小非常容易,只要点击并拖动行的边缘,或列的 头部。但如果你需要根据单元格的内容来设置行或列的大小,或者希望设置大量电子表格文件中的行列大小,编写 Python 程序来做就要快得多。
  • 设置行高和列宽
    • Worksheet 对象有 row_dimensions 和 column_dimensions 属性,控制行高和列宽。

import openpyxl
wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()
sheet['A1'] = 'Tall row'
sheet['B2'] = 'Wide column'
wb.save('./data/dimensions.xlsx')
sheet.row_dimensions
#因为表里只有两行数据所以显示两行
1: <openpyxl.worksheet.dimensions.RowDimension at 0x108af1f98>,
 2: <openpyxl.worksheet.dimensions.RowDimension at 0x108af1dd8>

sheet.column_dimensions

DimensionHolder([('A',
                  <openpyxl.worksheet.dimensions.ColumnDimension at 0x108af1c88>),
                 ('B',
                  <openpyxl.worksheet.dimensions.ColumnDimension at 0x108af1978>)])

#设置行高
sheet.row_dimensions[2].height = 50
#设置列宽
sheet.column_dimensions['A'].width = 80
wb.save('./data/dimensions.xlsx')

 注意:

  • 行的高度可以设置为 0 到 409 之间的整数或浮点值。这个值表示高度的点数。
    • 一点等于 1/72 英寸。默认的行高是 12.75。
  • 列宽可以设置为 0 到 255 之间的整数或浮点数。
    • 默认的列宽是 8.43 个字符。列宽为零或行高为零,将使单元格隐藏。

4. 合并和拆分单元格

  • 利用 merge_cells()工作表方法,可以将一个矩形区域中的单元格合并为一个单元格。
  • 要拆分单元格,就调用 unmerge_cells()工作表方法。
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()
sheet.merge_cells('A1:D7') #合并
sheet['A1'] = 'hello bobo'
wb.save('./data/merged.xlsx')

sheet.unmerge_cells('A1:D7')

sheet['A2'].value

5.冻结窗格

  • 对于太大而不能一屏显示的电子表格,“冻结”顶部的几行或最左边的几列,是很有帮助的。在 OpenPyXL 中,每个 Worksheet 对象都有一个 freeze_panes 属性,可以设置为一个 Cell 对象或一个单元格坐标的字符串。
    • 请注意,单元格上边的所有行和左边的所有列都会冻结,但单元格所在的行和列不会冻结。
  • 要解冻所有的单元格,就将 freeze_panes 设置为 None 或'A1'
#冻结
import openpyxl
wb = openpyxl.load_workbook('./data/produceSales.xlsx')
sheet = wb.get_active_sheet()
sheet.freeze_panes = 'A2'
wb.save('./data/produceSales.xlsx')
#解冻结
sheet.freeze_panes = None
wb.save('./data/produceSales.xlsx')

6.绘制图表

  • openpyxl 支持利用工作表中单元格的数据,创建条形图、折线图、散点图和饼图。要创建图表,需要做下列事情:
    • 1.从一个矩形区域选择的单元格,创建一个 Reference 对象。
    • 2.通过传入 Reference 对象,创建一个 Series 对象。
    • 3.创建一个 Chart 对象。
    • 4.将 Series 对象添加到 Chart 对象。
    • 5.可选地设置Chart 对象的drawing.top、drawing.left、drawing.width 和drawing.height变量用来设置图表的位置和大小。
    • 6.将 Chart 对象添加到 Worksheet 对象。
  • Reference 对象需要一些解释。Reference 对象表示图表要引用的数据区域。是通过调用 openpyxl.charts.Reference()函数并传入 3 个参数创建的:
    • 1.包含图表数据的 Worksheet 对象。
    • 2.两个整数的元组,代表矩形选择区域的左上角单元格,该区域包含图表数据:元组中第一个整数是行,第二个整数是列。请注意第一行是 1,不是 0。
    • 3.两个整数的元组,代表矩形选择区域的右下角单元格,该区域包含图表数据:元组中第一个整数是行,第二个整数是列。

import openpyxl
wb = openpyxl.load_workbook(filename='./data/sampleChart.xlsx')
sheet = wb.get_active_sheet()

    
refObj = openpyxl.charts.Reference(sheet, (1, 2),(10,2))
seriesObj = openpyxl.charts.Series(refObj, title='First series')
chartObj = openpyxl.charts.BarChart()

sheet.add_data(refObj )  #图标中添加数据
chartObj.append(seriesObj) #图标中添加数据两种方式
chartObj.drawing.top = 200 # set the position
chartObj.drawing.left = 200
chartObj.drawing.width = 300 # set the size
chartObj.drawing.height = 200

chartObj.title = sheet_name        
chartObj.x_axis.title = '日期'
chartObj.y_axis.title = '营收额'

sheet.add_chart(chartObj,"G1") #添加到制定sheet中

wb.save('./data/sampleChart.xlsx')

  •  我们可以调用 openpyxl.charts.BarChart(),创建一个条形图。也可以调用openpyxl.charts.LineChart()、openpyxl.charts.ScatterChart()和 openpyxl.charts.PieChart(),创建折线图、散点图和饼图。

效果:图的绘制

import openpyxl
from openpyxl.charts import Reference,BarChart,Series
import os
for file_name in os.listdir('./data/Bobo公司2020-2030年营收报表'):
    if file_name != '.DS_Store':  #苹果电脑会有一个隐藏文件,去掉不处理
        file_name = os.path.join('./data/Bobo公司2020-2030年营收报表',file_name)
        ex_file = openpyxl.load_workbook(file_name)
        sheet_names = ex_file.get_sheet_names() #获取所有表
        for sheet_name in sheet_names:
            sheet_file = ex_file.get_sheet_by_name(sheet_name)
            data=Reference(sheet_file, min_col=2,min_row =1,max_row=32,max_col=4 ) #推荐这种写法方便
          """  
            data1 = Reference(sheet_file, (2, 2),(32,2))
            data2 = Reference(sheet_file, (2, 3),(32,3))
            data3 = Reference(sheet_file, (2, 4),(32,4))
            seriesObj1 = Series(data1,title='手机')
            seriesObj2 = Series(data2,title='彩妆')
            seriesObj3 = Series(data3,title='电脑')
            """
            bc = BarChart()
            bc.title = sheet_name
            bc.x_axis.title = '日期'
            bc.y_axis.title = '营收额'
            #bc.append(seriesObj1)
            #bc.append(seriesObj2)
            #bc.append(seriesObj3)
            bc.add_data(data, titles_from_data=True )

         
            bc.drawing.top = 200 # set the position
            bc.drawing.left = 400
            bc.drawing.width = 600 # set the size
            bc.drawing.height = 400
            #使用日期这一列作为x轴
            x_label=Reference(sheet_file, min_col=1,min_row= =2,max_row=32 )
            bc.set_categories(x_label )
            sheet_file.add_chart(bc,'E5' ) 

            #sheet_file.add_chart(bc)
    ex_file.save(file_name)   

 7. 练习题【知识点回顾】

1.openpyxl.load_workbook()函数返回什么?

2.get_sheet_names()工作簿方法返回什么?

3.如何取得名为'Sheet1'的工作表的 Worksheet 对象?

4.如何取得工作簿的活动工作表的 Worksheet 对象?

5.如何取得单元格 C5 中的值?

6.如何将单元格 C5 中的值设置为"Hello"?

7.工作表方法 get_highest_column()和 get_highest_row()返回什么?

8.如何取得从 A1 到 F1 的所有 Cell 对象的元组?

9.如何将工作簿保存到文件名 example.xlsx?

10.如何在一个单元格中设置公式?

11.如果需要取得单元格中公式的结果,而不是公式本身,必须先做什么?

12.如何将第 5 行的高度设置为 100?

13.如何设置列 C 的宽度?

14.什么是冻结窗格?

7.1  实践项目

  • 创建一个9*9乘法表
  • 编写一个程序,翻转电子表格中行和列的单元格。例如,第 5 行第 3 列的值将 出现在第 3 行第 5 列(反之亦然)。这应该针对电子表格中所有单元格进行

以上是关于Python数据处理:筛选、统计、连表、拼接、拆分、缺失值处理的主要内容,如果未能解决你的问题,请参考以下文章

python处理Excel实现自动化办公教学(数据筛选公式操作单元格拆分合并冻结窗口图表绘制等)

Python | 字符串拆分和拼接及常用操作

python基础===拆分字符串,和拼接字符串

如何用python实现两个文件重复数据筛选并统计

Mysql连表查询

mysql连表查询