飞道的博客

9.Python办公自动化,pandas,numpy数据转换成DataFrame数据

400人阅读  评论(0)
#1.这是一个list
[[1,2],[3,4]]
#2.这是一个numpy.array
[[1 2] 
[3 4]]
#3.这是一个pandas.DataFrame

#4.这是一个numpy:<ndarray>

#5.这是一个pandas:<DataFrame>


一.安装anaconda
下载网址:https://www.anaconda.com/products/individual#Downloads

.安装如下第三方包
pip install -i https://pypi.doubanio.com/simple pandas
pip install -i https://pypi.doubanio.com/simple jupyter
pip install -i https://pypi.doubanio.com/simple xlrd
pip install -i https://pypi.doubanio.com/simple openpyxl
pip install -i https://pypi.doubanio.com/simple matplotlib
pip install -i https://pypi.doubanio.com/simple pillow
import pandas as pd
#1.1创建一个Series
s = pd.Series([1,2,3])
print(s)
#输出:
0    1
1    2
2    3
dtype: int64

#1.2创建一个Series
s = pd.Series([1,2,3],
              index=list("abc"),
              dtype="int64",
              name="num"
              )
print(s)
#输出:
a    1
b    2
c    3
Name: num, dtype: int64

#1.3字典的方式创建一个Series
d = {
   "a" :1,"b":2,"c":3}
s = pd.Series(d)
print(s)
"""
#输出:
a    1
b    2
c    3
dtype: int64
"""

#切片
print(s[0:2])
"""
#输出:
a    1
b    2
dtype: int64
"""
#步长为1,从最后一行开始往前输出
print(s[::-1])
"""
#输出:
c    3
b    2
a    1
dtype: int64
"""
#步长为2
print(s[::2])
"""
#输出:
a    1
c    3
dtype: int64
"""

#获取一个不存在的值让其返回一个默认值
print(s.get("d",888)) #输出:888
print(s.get("a")) #输出:1

#获取b的值,将其修改成22
#还可以有多种写法:s[1] = 22,还有s[["b","c"]] = [7,8],还有s[[True,False,True]]
s["b"] = 22
print(s)
"""
#输出:
a     1
b    22
c     3
dtype: int64
"""
#掩码取值,取值大于2的值,或者使用:s[s>2]
mask = s >2
print(mask)
"""
#输出:
a    False
b    False
c     True
dtype: bool
"""
#或者使用:s[s>2]
print(s[s>2])
"""
#输出:
c    3
dtype: int64
"""

#获取b的值将其修改成33
s[1] = 33
print(s)
"""
#输出:
a     1
b    33
c     3
dtype: int64
"""
#第1行和第3行值是True就被选中,可以更改其值,False就没有被选中,这种叫掩码取值
s[[True,False,True]] = [11,23]
print(s)
"""
#输出:
a    11
b     2
c    23
dtype: int64
"""

#1.4创建一个Series
s = pd.Series(3.0,index=["a","b"])
print(s)
#输出:
a    3.0
b    3.0
dtype: float64
import pandas as pd
#2.1创建一个DataFrame
list_2d = [[1,2],
           [3,4]]
df = pd.DataFrame(list_2d)
print(df)
#输出:
   0  1
0  1  2
1  3  4

#2.2创建一个DataFrame
list_2d = [[1,2],
           [3,4]]
df = pd.DataFrame(list_2d,columns=["A","B"],index=["x","y"])
print(df)
#输出:
   A  B
x  1  2
y  3  4

#2.3字典创建一个DataFrame
d = {
   "A":[1,3],"B":[2,4]}
df = pd.DataFrame(d,index=["x","y"])
print(df)
#输出:
   A  B
x  1  2
y  3  4



import pandas as pd

"""
squeeze=False(默认) 表明是DataFrame结构
squeeze=True 表明是Series结构
mangle_dupe_cols=True(默认) 是否重命名重复列
nrows=5,要解析5行内容,完整图标只显示头5行内容,默认是None,显示全部
thousands=None(默认) 
thousands="," 将文本类型千分位上的逗号去掉,变成数字类型 如:2,123 ->2123
convert_float=True(默认) 将浮点数转换成int类型 例:1.0 -> 1
"""
#读取第一个表格的内容
df = pd.read_excel("123.xlsx")
print(df)

#读取一个表格子表格名称叫“2月”的表格
df = pd.read_excel("123.xlsx",sheet_name="2月")
print(df)

#读取第3个子表格,第一个子表格是0
df = pd.read_excel("123.xlsx",sheet_name=2)
print(df)

#读取第2个子表格和”3月“子表格的内容
df = pd.read_excel("123.xlsx",sheet_name=[1,"3月"])
print(df)  #读取第2个子表格和”3月“子表格的内容
print(df[1])  #读取第2个子表格
print(df["3月"]) #读取”3月“子表格的内容

#读取所有子表格的内容
df = pd.read_excel("123.xlsx",sheet_name=None)
print(df) #读取所有子表格的内容
print(df["3月"]) #读取”3月“子表格的内容

#读取第一个表格的内容,没有表头
df = pd.read_excel("123.xlsx",sheet_name=0,header=None)
print(df)
#输出:
     0    1     2
0   月份   销量   销售额
1  1月份  100  1000


import pandas as pd
#读取第一个表格的内容,第一行作为表头
df = pd.read_excel("123.xlsx",sheet_name=0,header=1)
print(df)
#输出:
   1月份  100  1000
0  1月份  101  1050

#读取第一个表格的内容,第一行和第二行作为表头
df = pd.read_excel("123.xlsx",sheet_name=0,header=[0,1])
print(df)
#输出:
    月份   销量   销售额
   1月份  100  1000
0  1月份  101  1050
import pandas as pd



df = pd.read_excel("234.xlsx",sheet_name=5,header=[0,1])
print(df)
"""
#输出:
      京东         淘宝     拼多多    
   销量   利润  销量  利润  销量 利润
0  221   569   587   75   78  94
1  236   785   964  415   96  26
2  245  5789   56   97    47  17
"""
print(df[("京东","利润")]+df[("淘宝","利润")]+df[("拼多多","利润")])
"""
569+75+94=738
#输出:
0     738
1    1226
2    5903
dtype: int64
"""
print(df["京东"]+df["淘宝"]+df["拼多多"])
"""
#输出:
    销量   利润
0   886   738
1   1296  1226
2   348   5903
"""
#实现一个拼图将总量添加右侧
df_total = df["京东"]+df["淘宝"]+df["拼多多"]
#制作一个总量的复合表头,由总量和列名组成
df_total.columns = pd.MultiIndex.from_product(
   [ ["总量"],
    df_total.columns]
)
#根据行索引进行左右拼接
df1 = df.join(df_total)
print(df1)
"""
#输出:
      京东       淘宝      拼多多       总量      
   销量  利润  销量 利润  销量 利润    销量  利润
0  221   569  587  75   78   94    886   738
1  236   785  964  415  96   26    1296  1226
2  245  5789  56   97   47   17    348   5903
"""


#将第3列作为索引放在第一列显示:index_col索引列
#指定行索引:index_col=2 第三列做为索引,index_col="销售额","销售额"列作为索引,
#index_col=[0,1],第1和第2列作为索引
df = pd.read_excel("123.xlsx",sheet_name=0,header=None,index_col=2)
print(df)
#输出:            
2       0     1
销售额  月份  销量
1000  1月份  100
1050  1月份  101

#显示A列和C列:usecols显示哪些列
df = pd.read_excel("123.xlsx",sheet_name=0,header=None,usecols="A,C")
print(df)
#输出:
     0     2
0   月份   销售额
1  1月份  1000
2  1月份  1050

#显示A列和B到C列:usecols显示哪些列,以及输出索引范围
df = pd.read_excel("123.xlsx",sheet_name=0,header=None,usecols="A,B:C")
print(df)
#输出:
     0    1     2
0   月份   销量   销售额
1  1月份  100  1000
2  1月份  101  1050
print(df.index)
#输出:
RangeIndex(start=0, stop=3, step=1)

#显示第一列和第三列
df = pd.read_excel("123.xlsx",sheet_name=0,header=None,usecols=[0,2])
print(df)
#输出:
     0     2
0   月份   销售额
1  1月份  1000
2  1月份  1050

#显示"月份"和"销量"列
df = pd.read_excel("123.xlsx",usecols=["月份","销量"])
print(df)
#输出:
    月份   销量
0  1月份  100
1  1月份  101

#skiprows=1,跳过不显示第一行
df = pd.read_excel("123.xlsx",sheet_name="1月",header=None,skiprows=1)
print(df)
#输出:
     0    1     2
0  1月份  100  1000
1  1月份  101  1050

#skiprows=[1,2],跳过不显示第2行和第3行
df = pd.read_excel("123.xlsx",sheet_name="1月",header=None,skiprows=[1,2])
print(df)
#输出:
    0   1    2
0  月份  销量  销售额

#添加列标题名
df = pd.read_excel("234.xlsx",header=None,names=["月份","销量","销售额"])
print(df)
#输出:
   月份   销量  销售额
0   1  245  789
1   2  759  452
2   3  452  741
#查看每列的数据类型
print(df.dtypes)
#输出:
月份     int64
销量     int64
销售额    int64
dtype: object

#下面也是一种转换成字符串格式的写法
#df = pd.read_excel("234.xlsx",header=None,names=["月份","销量","销售额"],
                   ).convert_dtypes()
#设置列的数据类型dtype,设置月份和销量的数据类型为string
df = pd.read_excel("234.xlsx",header=None,names=["月份","销量","销售额"],
                   dtype={
   "月份":"str","销量":"string"})
#设置月份的数据类型为string
df["月份"] = df["月份"].astype("string")
print(df.dtypes)
#输出:
月份     string
销量     string
销售额     int64
dtype: object
#如果有哪一列没有转换成功就先转换成str,然后再转换成string
df["销售额"] = df["销售额"].astype(str).astype("string")

#选择输出都是string类型的列
print(df.select_dtypes(include="string"))

#一般季节这种有固定选项的数据类型就是分类:category
#日期数据类型: 年份:period[A-DEC],日期:datetime64[ns]

import pandas as pd

df = pd.read_excel("234.xlsx",sheet_name=1)
print(df)
"""
#输出:
     日期        日期1         日期2      日期3           日期4
0  20210522 2021-05-22  22/05/2021  2021-05-22  2021-05-22 23:26:10
"""
print(df.dtypes)
"""
#输出:
日期              int64
日期1    datetime64[ns]
日期2            object
日期3            object
日期4            object
dtype: object
"""
#在读取文件的时候增加参数:parse_dates=[0,1,2,3,4],将0,1,2,3,4列设置成日期类型
df = pd.read_excel("234.xlsx",sheet_name=1,parse_dates=[0,1,2,3,4])
print(df.dtypes)
"""
#输出:
日期     datetime64[ns]
日期1    datetime64[ns]
日期2    datetime64[ns]
日期3    datetime64[ns]
日期4            object
dtype: object
"""
#如果要把日期和日期1两列内容连接起来组成1列:parse_dates=[[0,1]]
df = pd.read_excel("234.xlsx",sheet_name=1,parse_dates=[[0,1]])
print(df)
"""
#输出:
            日期_日期1                 日期2          日期3          日期4
0      2021-05-22 00:00:00-22:00  22/05/2021  2021-05-22  2021-05-22 23:26:10
"""

#如果要把日期(第0列)和日期1(第1列)两列内容连接起来组成1列:parse_dates={"年_月_日":[0,1]},合并列取名:年_月_日
df = pd.read_excel("234.xlsx",sheet_name=1,parse_dates={
   "年_月_日":[0,1]})
print(df)
"""
#输出:
            年_月_日             日期2         日期3            日期4
0 2021-05-22 00:00:00-22:00  22/05/2021  2021-05-22  2021-05-22 23:26:10
"""

import pandas as pd
#如果有日期格式如:2021年5月23日,数据类型是object类型,要将其转换成日期格式 datetime64[ns]
读取文件的时候加上如下参数即可:parse_dates=[0]表示是第0列的数据
parse_dates=[0],date_parser=lambda x: pd.to_datetime(x,format="%Y年%m月%d日")

df = pd.read_excel("234.xlsx",sheet_name=1,parse_dates=[0],date_parser=lambda x: pd.to_datetime(x,format="%Y年%m月%d日"))
print(df)
"""
#输出:
    日期        日期1         日期2         日期3           日期4
0 2021-05-23 2021-05-22  22/05/2021  2021-05-22  2021-05-22 23:26:10 
"""

import pandas as pd
#替换nan值的方法
df = pd.read_excel("234.xlsx",sheet_name=2)
print(df)
"""
#输出:
    列1   列2
0    a    0
1  NaN  NaN
2  NaN     
3    b    1
"""
#na_values=0将0替换为nan值,na_values="a":将a替换为nan值," "空格替换为nan值
df = pd.read_excel("234.xlsx",sheet_name=2,na_values=["a",0," "])
print(df)
"""
#输出:
    列1   列2
0  NaN  NaN
1  NaN  NaN
2  NaN  NaN
3    b  1.0
"""
#如果加上列名,就只替换这一列满足条件的内容,其他列满足条件的不进行替换,这里只替换“列2”的内容
#na_values=0将0替换为nan值,na_values="a":将a替换为nan值," "空格替换为nan值
df = pd.read_excel("234.xlsx",sheet_name=2,na_values={
   "列2":["a",0," "]})
print(df)
"""
#输出:
     列1   列2
0    a  NaN
1  NaN  NaN
2  NaN  NaN
3    b  1.0
"""

import pandas as pd

df = pd.read_excel("234.xlsx",sheet_name=2)
print(df)
"""
#输出:
   a   b
0  1  10
1  2  20
"""
"a":lambda x:x.strip(), #去除列名a左右的空格

#将数据第1列都加上10,第2列乘以2倍
df = pd.read_excel("234.xlsx",sheet_name=2,
                   converters={
   
                       "a":lambda x:x+10, #a列加10
                       "b":lambda x:x*2,  #b列乘以2倍
                   })
print(df)
"""
#输出:
    a   b
0  11  20
1  12  40
"""
import pandas as pd

#通过索引获取列的值和更改列的值
#还可以写成:df[(df["b"]>2) & (df["b"]<6)] 且关系
#还可以写成:df[(df["b"]==2) | (df["b"]==8)] 或关系
#还可以写成:df[~(df["b"]==2)] 不等于关系
df = pd.read_excel("234.xlsx",sheet_name=2)
print(df)
"""
#输出:
   a   b
0  1  10
1  2  20
"""
#判断b列值是否大于11
print(df["b"]>11)
"""
#输出:
0    False
1     True
Name: b, dtype: bool
"""
#显示b列值大于11的值
print(df[df["b"]>11])
"""
#输出:
   a   b
1  2  20
"""
#只显示b列的数值
print(df[["b"]])
"""
#输出:
   b
0  10
1  20
"""
#只显示第1行,也就是True的那一行,这种带True,False的取值方式叫掩码取值
print(df[[True,False]])
"""
#输出:
   a   b
0  1  10
"""
#获取b列的数值,将b列值更改为101,201
df["b"] = [101,201]
print(df)
"""
#输出:
   a    b
0  1  101
1  2  201
"""
#修改a列和b列值
df[["a","b"]] = [[101,201],[202,203]]
print(df)
"""
#输出:
    a    b
0  101  201
1  202  203
"""
import pandas as pd
#写文件

#pandas写excel文件 to_excel()
"""

"""
df = pd.DataFrame(
    {
   
        "销量":[10,20],
        "售价":[100,200],
    }
)
print(df)
"""
#输出:
   销量   售价
0  10  100
1  20  200
"""
#写入到excel里面,如果要写入到csv里面有:df.to_csv,df.to_json等,没有tb.xlsx就会自动创建
df.to_excel("tb.xlsx")

"""
index=True(默认) 输出行标签 如:index=False 不输出行标签
sheet_name 输出的表格sheet名称
float_format=None(默认) 浮点数输出格式,float_format="%.2f",有小数的保留两位小数
na_rep="" 缺省值输出的表现形式,可以将空白的缺省值填充为任何字符串,如:na_rep="我是空值" 
"""
df.to_excel("tb1.xlsx",index=False,sheet_name="你好",float_format="%.2f",na_rep="")
#生成内容图片如下:

import pandas as pd

df = pd.DataFrame(
    {
   
        "销量":[10,20],
        "售价":[100,200],
    },
    index=["aaa","bbb"]
)
print(df)
"""
#输出:
     销量   售价
aaa  10  100
bbb  20  200
"""

#增加索引列名
df.index.name = "货号"
print(df)
"""
#输出:
货号 销量 售价
aaa  10  100
bbb  20  200
"""
#写入到excel里面,如果要写入到csv里面有:df.to_csv,df.to_json等
df.to_excel("tb.xlsx")


import pandas as pd
from datetime import datetime

#ExcelWriter类
df1 = pd.DataFrame(
    {
   
        "日期":[datetime(2021,5,23),datetime(2021,5,24)],
        "销量":[10,100]
    }
)
df2 = pd.DataFrame(
    {
   
        "日期":[datetime(2021,6,23),datetime(2021,6,24)],
        "销量":[20,200]
    }
)
#ExcelWriter类,可以同时输出多个sheet工作簿,设置datatime输出格式
with pd.ExcelWriter("tabao.xlsx",datetime_format="YYYY-MM-DD") as writer:
    df1.to_excel(writer,sheet_name="AAA")
    df2.to_excel(writer,sheet_name="BBB")

import pandas as pd

#读写csv文件
df = pd.DataFrame({
   
    "售价":[25,37],
    "销量":[100,199]
})
"""
sep:以|进行分隔,一般是以逗号分隔
encoding="GBK" 编码方式是gbk,如果要读的话编码方式必须和写的是一样才不出错,还有utf8格式
"""
df.to_csv("cs.csv",index=False,encoding="GBK",sep="|")

#读取csv文件,必须和前面写入的csv文件编码格式相同
df = pd.read_csv("cs.csv",encoding="GBK")
print(df)
"""
#输出:
  售价|销量
0  25|100
1  37|199
"""
import pandas as pd

#pandas数据切片
#这个地方可以写成:index=list("xyz")
df = pd.DataFrame({
   
    "A":[1,4,7],
    "B":[2,5,8],
    "C":[3,6,9]
},index=["x","y","z"])
print(df)
"""
#输出:
   A  B  C
x  1  2  3
y  4  5  6
z  7  8  9
"""
#输出第1行,第2行
print(df[0:2])
"""
#输出:
   A  B  C
x  1  2  3
y  4  5  6
"""
#输出x到z行
print(df["x":"z"])
"""
#输出:
   A  B  C
x  1  2  3
y  4  5  6
z  7  8  9
"""

import pandas as pd
#df.loc方法选择数据
#这个地方可以写成:index=list("xyz")
df = pd.DataFrame({
   
    "A":[1,4,7],
    "B":[2,5,8],
    "C":[3,6,9]
},index=["x","y","z"])
print(df)
"""
#输出:
   A  B  C
x  1  2  3
y  4  5  6
z  7  8  9
"""
#输出x行的值
print(df.loc["x"])
"""
#输出:
A    1
B    2
C    3
"""
#输出x行和B列的交叉的值
print(df.loc["x","B"]) #输出:2
#输出x,y行和B,C列的交叉值
print(df.loc[["x","y"],["B","C"]])
"""
#输出:
   B  C
x  2  3
y  5  6
"""
#行的选择是第1行和第3行是True,列选择的是第2列是True,交叉值
print(df.loc[[True,True,False],[False,True,False]])
"""
#输出:
   B
x  2
y  5
"""
#行从x到y,列从A到B,取交叉值部分
print(df.loc["x":"y","A":"B"])
"""
#输出:
   A  B
x  1  2
y  4  5
"""
#选择全部的行
print(df.loc[:,"B":"C"])
"""
#输出:
   B  C
x  2  3
y  5  6
z  8  9
"""
#选择全部的列
print(df.loc["x":"y",:])
"""
#输出:
    A  B  C
x  1  2  3
y  4  5  6
"""
#列按着倒序输出
print(df.loc[:,::-1])
"""
#输出:
   C  B  A
x  3  2  1
y  6  5  4
z  9  8  7
"""
#行按着倒序输出
print(df.loc[::-1,:])
"""
#输出:
   A  B  C
z  7  8  9
y  4  5  6
x  1  2  3
"""
#步长为2输出
print(df.loc[::2,::2])
"""
#输出:
   A  C
x  1  3
z  7  9
"""
import pandas as pd

#df.iloc方法的使用选择数据
df = pd.DataFrame({
   
    "A":[1,4,7],
    "B":[2,5,8],
    "C":[3,6,9]
},index=list("xyz"))
print(df)
"""
#输出:
   A  B  C
x  1  2  3
y  4  5  6
z  7  8  9
"""
#输出第1行
print(df.iloc[0])
"""
#输出:
A    1
B    2
C    3
Name: x, dtype: int64
"""

#输出第1行到第2行[0,1],和第2到第3列[1,2]
print(df.iloc[[0,1],[1,2]])
"""
#输出:
   B  C
x  2  3
y  5  6
"""
#输出第1行到第3行是True,和第1列到第3列是True
print(df.iloc[[True,False,True],[True,False,True]])
"""
#输出:
   A  C
x  1  3
z  7  9
"""
#取行0,1行取列1,2列
print(df.iloc[0:2,1:3])
"""
#输出:
   B  C
x  2  3
y  5  6
"""
import pandas as pd

#pandas数据统计,数据透视表制作
df = pd.read_excel("234.xlsx",sheet_name=4)
print(df)
"""
#输出:
   花费  时间   星期
0  13.6  中午  星期一
1  56.3  下午  星期二
2  14.8  中午  星期一
3  63.1  下午  星期三
4  69.3  下午  星期四
"""
#按时间和星期分类分组后求和,进行统计一共花费多少钱
df1 = df.groupby(["时间","星期"]).sum()
print(df1)
"""
#输出:         
时间   星期    花费   
下午   星期三  63.1
      星期二  56.3
      星期四  69.3
中午  星期一   28.4
"""
#分组统计后,筛选出花费大于50的数据
df1 = df.groupby(["时间","星期"]).sum().loc[lambda df:df["花费"]>50]

#上面的写法可以写成:df1 = df.groupby(["时间","星期"]).sum()
               # df1 = df[df["花费"]>50]
print(df1)
"""
#输出:                
时间 星期   花费   
下午 星期三  63.1
    星期二  56.3
    星期四  69.3
"""
import pandas as pd

#将数组数据转换成DataFrame数据结构中
data = [[1,2,3,4],
        [5,6,7,8],
        [9,10,11,12],
        [13,14,15,16]]
df = pd.DataFrame(
    data,
    columns=list("ABCD"),
    index=list("axyz")
)
print(df)
"""
#输出:
    A   B   C   D
a   1   2   3   4
x   5   6   7   8
y   9  10  11  12
z  13  14  15  16
"""
#A列数据全部设置成100
df["A"] = 100
#B列数据乘以10倍
df["B"]= df["B"]*10
#新增加一列的数据E=C列+D列
df["E"] = df["C"]+df["D"]
print(df)
"""
#输出:
     A    B   C   D   E
a  100   20   3   4   7
x  100   60   7   8  15
y  100  100  11  12  23
z  100  140  15  16  31
"""
#显示E列数据大于15的数据
print(df.loc[df["E"]>15,"E"])
"""
#输出:
y    23
z    31
Name: E, dtype: int64
"""
import pandas as pd
import numpy as np
#将无穷大当成空值处理,在一开始就加入这句话
pd.options.mode.use_inf_as_na = True

#pandas对于加减乘除运算遇到分母为0或者单元格为空值的处理方法
df = pd.DataFrame(
    [[1,2],
    [1,np.NaN],
     [np.NaN,1]],
    columns=list("AB")
)
print(df)
"""
#输出:
     A    B
0  1.0  2.0
1  1.0  NaN
2  NaN  1.0
"""
#如果要计算不出错的就不能使用常用的:+-*/了,要用add,sub,mul,div
#下面以加法为例,fill_value=0,将空值填充为0进行计算
"""
加法:df["A"].add(df["B"],fill_value=0)
减法:df["A"].sub(df["B"],fill_value=0)
陈法:df["A"].mul(df["B"],fill_value=0)
除法:df["A"].div(df["B"],fill_value=0)
"""
#A列和B列相加
print(df["A"].add(df["B"],fill_value=0))
"""
#输出:
0    3.0
1    1.0
2    1.0
dtype: float64
"""
#计算结果有一个inf无穷大,因为在开始加了pd.options.mode.use_inf_as_na = True
#所以无穷就被当成一个空值处理了
print(df["A"].div(df["B"],fill_value=0))
"""
#输出:
0    0.5
1    NaN
2    0.0
dtype: float64
"""

转载:https://blog.csdn.net/weixin_42605384/article/details/116812107
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场