新pandas 模块
pandas 模块
该模块是python数据分析的核心模块,它主要提供了五大功能:
1.支持文件存取操作,支持数据库(sql)、html、json、pickle、csv(txt、excel)、sas、stata、hdf等。
2.支持增删改查、切片、高阶函数、分组聚合等单表操作,以及和dict、list的互相转换。
3.支持多表拼接合并操作。
4.支持简单的绘图操作。
5.支持简单的统计分析操作。
它的主要数据结构
Series
数据结构类似于Numpy中的一维数组(现在一般不用了),DataFrame
类似于多维表格数据结构。
大多数时候pandas是起到文件处理的作用,它的核心就是对numpy+xlrd模块做了一层封装。
Series数据结构
首先Series比较像列表(数组)和字典的结合体
基本格式如下
import pandas as pd
import numpy as np
df = pd.Series(np.array([1,2,3,4,5]))
print(df)
#结果为
"""
0 1
1 2
2 3
3 4
4 5
dtype: int32
"""
values
属性的作用是返回数据结构中的实际数据部分(不包括索引)。对于DataFrame
,values
返回一个包含所有数据的二维数组,而对于Series
,values
返回一个包含所有数据的一维数组。
格式如下
import pandas as pd
import numpy as np
df = pd.Series(np.array([1,2,3,4,5]))
print(df.values)
#结果为
"""
[1 2 3 4 5]
"""
对于Series目前仅做理解即可
DataFrame数据结构
1.date_range
参数详解:
参数 | 详解 |
---|---|
start | 开始时间 |
end | 结束时间 |
periods | 时间长度 |
freq | 时间频率,默认情况是"D",可选H(our),W(eek),B(usiness),S(emi-)M(onth),(min)T(es),S(econd),A(year),… |
例子格式如下
import pandas as pd
dates = pd.date_range("20190101", periods=6, freq='M')
print(dates)
#结果为
"""
DatetimeIndex(['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30',
'2019-05-31', '2019-06-30'],
dtype='datetime64[ns]', freq='M')
"""
这里我的freq='M'代表月末(Month End),生成的日期会是每个月的最后一天,然后这里的period指的是生成的日期数量。与end
参数互斥,如果两者都没有指定,则需要指定statr
。
然后这里用numpy模块生成一个数组再用pandas模块添加列名
例子如下
#DataFrame与numpy数组的结合
import numpy as np
import pandas as pd
#这里生成一个6行4列的随机数组,元素取值范围在(0,1)之间,然后乘以10
values = np.random.rand(6, 4)*10
#生成一个包含6个月份的日期范围
dates = pd.date_range("20190101", periods=6, freq='M')
#定义DataFrame的列名
columns = ['c1', 'c2', 'c3', 'c4']
#使用values、dates和columns创建DataFrame
df = pd.DataFrame(data=values,index=dates, columns=columns)
#打印创建的DataFrame
print(df)
结果如图
这里详细讲解一下DataFrame内的参数
参数的格式
pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
参数 | 讲解 |
---|---|
data | 数据部分:可以是二维数组,Series对象,字典或字典的列表,结构化或记录数组等 |
index | 行索引,就是给行添加数据 |
column | 列索引,就是给列添加数据 |
dtype | 指定数据框的数据类型。如果未提供,将根据数据推断 |
copy | 默认为False。如果为True,则将数据复制到数据框。如果为False,则尽量避免复制。 |
最主要的三个参数是data、index、column
DataFrame属性的情况
属性 | 详解 |
---|---|
dtype | 查看数据类型 |
index | 查看行序列或者索引(也可以理解为查看行的内容) |
column | 查看各列的标签 |
values | 查看数据框内的数据,也即不含表头索引的数据 |
describe | 查看数据每一列的极值,均值,中位数,只可用于数值型数据 |
transpose | 转置,也可用T来操作 |
sort_index | 排序,可按行或列index排序输出 |
sort_values | 按数据值来排序 |
代码例子如下
#属性一览
import pandas as pd
import numpy as np
values = np.random.rand(6,4)*10
dates = pd.date_range("20230101", periods=6, freq="M")
columns = ["c1","c2","c3","c4"]
df = pd.DataFrame(values, index=dates,columns=columns)
# print(df)
print('*'*10)#这里打印符号方便查看
print(df.dtypes)#这里查看数据类型
print('*'*10)#这里打印符号方便查看
print(df.index)#这里查看行的内容
print('*'*10)#这里打印符号方便从查看
print(df.columns)#这里打印列的内容
print('*'*10)#这里打印符号方便查看
print(df.values)#查看数据框内的数据
print('*'*10)#这里打印符号方便查看
print(df.describe())#查看数据每一列的极值,均值,中位数,只可用于数据型数据
print('*'*10)#这里打印符号方便查看
print(df.T)#转置,这里的T的功能就是将列的内容和行的内容进行互相替换
print('*'*10)#这里打印符号方便查看
print(df.sort_index)#排序
print('*'*10)#这里打印符号方便查看
print(df.sort_values)#按数据值来排序
效果如图
DataFrame取值的情况
1.通过columns
数据取值
现在获取columns
数据为c1
的数据
格式如下
import numpy as np
import pandas as pd
values = np.random.rand(6,4)*10
dates = pd.date_range("20230101",periods=6,freq="M")
columns = ['c1','c2','c3','c4']
df = pd.DataFrame(values, index=dates, columns=columns)
print(df[['c1']])#这里输出c1的数据
#结果为
"""
c1
2023-01-31 6.096437
2023-02-28 1.488695
2023-03-31 8.266699
2023-04-30 7.555657
2023-05-31 7.897073
2023-06-30 0.150620
"""
2.通过loc
获取数据
通过自定义的行标签选择数据
格式如下
import numpy as np
import pandas as pd
values = np.random.rand(6,4)*10
data = pd.date_range("20230101",periods=6,freq='M')
column = ['c1','c2','c3','c4']
df = pd.DataFrame(values,index=data,columns=column)
# print(df)
print(df.loc['2023-01-31':'2023-02-28'])#获取行为2023-01-31和2023-02-28的数据
#结果为
"""
c1 c2 c3 c4
2023-01-31 6.406121 9.047321 5.457664 2.741886
2023-02-28 9.378504 0.122961 3.324112 2.723593
"""
还一种方法
格式如下
import numpy as np
import pandas as pd
values = np.random.rand(6,4)*10
data = pd.date_range("20230101",periods=6,freq='M')
column = ['c1','c2','c3','c4']
df = pd.DataFrame(values,index=data,columns=column)
print(df[0:2])#这里获取行的索引在0和2之间的数据
#结果为
"""
c1 c2 c3 c4
2023-01-31 3.496081 5.633354 4.338063 7.897088
2023-02-28 6.231203 2.464580 9.259144 5.170454
"""
3.通过逻辑判断取值
基本格式
import numpy as np
import pandas as pd
# 生成一个6行4列的随机数组,元素取值范围在[0, 1),然后乘以10
values = np.random.rand(6, 4) * 10
# 生成一个包含6个月份的日期范围
data = pd.date_range("20230101", periods=6, freq='M')
# 定义DataFrame的列名
columns = ['c1', 'c2', 'c3', 'c4']
# 使用values、dates和columns创建DataFrame
df = pd.DataFrame(values, index=data, columns=columns)
# 打印输出原始DataFrame
print("原始 DataFrame:\n", df)
# 选择满足 'c1' 列中大于 0 的行
selected_rows = df[df['c1'] > 0]
# 打印输出符合条件的行
print("\n选择满足条件的行:\n", selected_rows)
#结果为
"""
原始 DataFrame:
c1 c2 c3 c4
2023-01-31 1.491329 4.608074 7.323318 1.824254
2023-02-28 1.886686 4.220090 4.909640 6.038502
2023-03-31 1.173663 2.379967 4.051179 5.710181
2023-04-30 3.885409 7.762924 9.470510 3.961858
2023-05-31 5.761210 0.588241 8.785080 7.475626
2023-06-30 3.960443 0.503487 5.395907 6.931867
选择满足条件的行:
c1 c2 c3 c4
2023-01-31 1.491329 4.608074 7.323318 1.824254
2023-02-28 1.886686 4.220090 4.909640 6.038502
2023-03-31 1.173663 2.379967 4.051179 5.710181
2023-04-30 3.885409 7.762924 9.470510 3.961858
2023-05-31 5.761210 0.588241 8.785080 7.475626
2023-06-30 3.960443 0.503487 5.395907 6.931867
"""
例子格式如下
import numpy as np
import pandas as pd
values = np.random.rand(6,4)*10
data = pd.date_range("20230101",periods=6,freq='M')
column = ['c1','c2','c3','c4']
df = pd.DataFrame(values,index=data,columns=column)
print(df[df['c1']>0])#这里进行判断
#结果为
"""
c1 c2 c3 c4
2023-01-31 0.887502 8.715718 4.812277 2.894186
2023-02-28 7.595577 3.879889 4.856080 9.211648
2023-03-31 7.797549 8.983207 5.560610 5.388468
2023-04-30 0.171449 8.355725 3.301951 4.577735
2023-05-31 5.654572 7.429806 7.169636 4.452716
2023-06-30 4.468159 7.121082 8.999174 7.527340
"""
DataFrame值替换
1.iloc
进行判断
iloc
的第一个参数位置表示行的位置,第二个参数表示列的位置。
iloc[行的索引,列的索引]
这里将位于行的索引2,列的索引为3的数据变成0
例子如下
#DataFrame值替换的情况
import numpy as np
import pandas as pd
values = np.random.rand(6,4)*10
data = pd.date_range("2023-01-01",periods=6,freq='M')
column = ['c1', 'c2', 'c3', 'c4']
df = pd.DataFrame(values,index=data,columns=column)
df.iloc[2,3] = 0
print(df)
#结果为
"""
c1 c2 c3 c4
2023-01-31 9.552043 2.513891 4.328620 7.834606
2023-02-28 4.141166 4.652884 5.973346 4.699575
2023-03-31 0.126369 5.298674 1.507820 0.000000#这里就变成了0
2023-04-30 4.509388 5.697588 7.461601 3.162913
2023-05-31 7.137976 0.015132 4.529471 0.959858
2023-06-30 4.418833 5.175493 6.768822 1.341100
"""
还有一个特别的情况
例子如下
import numpy as np
import pandas as pd
values = np.random.rand(6, 4)*10
data = pd.date_range('2023-01-01', periods=6, freq='M')
column = ['c1', 'c2', 'c3', 'c4']
df = pd.DataFrame(values, index=data, columns=column)
df.iloc[0:2, 1:2] = 0#将行索引在0和2之间同时列索引在1和2之间的数据变成0
print(df)
#结果为
"""
c1 c2 c3 c4
2023-01-31 4.390027 0.000000 2.069853 1.293813
2023-02-28 2.847720 0.000000 8.532663 8.966715
2023-03-31 9.311313 5.470657 1.617050 5.193156
2023-04-30 9.809500 9.480820 9.174329 8.707713
2023-05-31 7.473565 9.687550 8.396161 5.165638
2023-06-30 2.207314 6.087769 6.353474 5.352209
"""
2.replace
进行判断
replace
方法用于替换数据框或列中的值,该方法的一般语法
DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')
参数讲解
参数 | 描述 | 类型 | 默认值 |
---|---|---|---|
to_replace | 要被替换的值 | 单一值、字典、列表、正则表达式 | None |
value | 用于替换的新值 | 单一值、与to_replace长度相同的列表 | None |
inplace | 是否在原地修改数据框 | 布尔值 | None |
limit | 对于每个元素,最多替换的次数 | 整数 | None |
regex | 是否将to_replace视为正则表达式 | 布尔值 | None |
method | 当使用正则表达式时,指定匹配时的替换 方法 | 字符串 | None |
替换单个值的情况
import pandas as pd
df = pd.read_csv('test_data.csv', header=None)
# 替换 '1.4' 为 '123',最多替换2次
df1 = df.replace(to_replace=1.4, value=123)
# 打印替换后的数据框
print(df1)
"""
0 1 2 3
0 5.1 NaN 123.0 0.2
1 4.9 3.0 123.0 0.2
2 4.7 3.2 NaN 0.2
3 7.0 3.2 4.7 123.0
4 6.4 3.2 4.5 1.5
5 6.9 3.1 4.9 NaN
"""
这里展示多个值替换
import pandas as pd
df = pd.read_csv('test_data.csv', header=None)
# 替换 '1.4' 为 '1400','5.1'为'1314', ’3.2‘为'521'
df1 = df.replace({1.4: 1400, 5.1: 1314, 3.2: 521})
# 打印替换后的数据框
print(df1)
#结果为
"""
0 1 2 3
0 1314.0 NaN 1400.0 0.2
1 4.9 3.0 1400.0 0.2
2 4.7 521.0 NaN 0.2
3 7.0 521.0 4.7 1400.0
4 6.4 521.0 4.5 1.5
5 6.9 3.1 4.9 NaN
"""
读取CSV文件
读取CSV文件也可以理解为pandas操作表格
这里简单了解一个模块io
,该模块中的方法StringIO
会将指定的内容读入到内存中,相当于变成了文件
例子如下
from io import StringIO
test_data = '''
5.1,,1.4,0.2
4.9,3.0,1.4,0.2
4.7,3.2,,0.2
7.0,3.2,4.7,1.4
6.4,3.2,4.5,1.5
6.9,3.1,4.9,'''
print(test_data)
test_data = StringIO(test_data)#把test_data读入内存,相当于变成了文件
print(test_data)
#结果为
"""
5.1,,1.4,0.2
4.9,3.0,1.4,0.2
4.7,3.2,,0.2
7.0,3.2,4.7,1.4
6.4,3.2,4.5,1.5
6.9,3.1,4.9,转换前的数据
<_io.StringIO object at 0x0000025E0EDA7D90>"""#转换后的情况
这里将上面转换的文件进行读取
import pandas as pd
from io import StringIO
# 定义 CSV 格式的文本数据
test_data = '''
5.1,,1.4,0.2
4.9,3.0,1.4,0.2
4.7,3.2,,0.2
7.0,3.2,4.7,1.4
6.4,3.2,4.5,1.5
6.9,3.1,4.9,'''
# 使用 StringIO 将文本数据读入内存,创建一个类文件对象
test_data = StringIO(test_data)
# 使用 pd.read_csv 读取 CSV 数据,header=None 表示数据没有头部信息
df = pd.read_csv(test_data, header=None)
# 为 DataFrame 添加列名
df.columns = ['c1', 'c2', 'c3', 'c4']
# 打印输出结果
print(df)
#结果为
"""
c1 c2 c3 c4
0 5.1 NaN 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 NaN 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5
5 6.9 3.1 4.9 NaN
"""
切记这个代码中的header=None
它的作用当读取过来的数据没有头部信息时,pandas将为每列分配默认的整数列标签。然后我还给DataFrame添加了列名,同理我也可以用df.index
给它添加行名(有些BUG)。
read_csv函数
该函数是用于读取csv文件而存在的,它的参数主要的有三个
1.filepath_or_buffer
该参数是指定要读取的文件路径或文件对象
2.sep
该参数是指定字段之间的分隔符。默认情况是逗号,可以使用其他字符例如制表符\t
3.header
该参数的作用是指定用做列名的行数,默认是'infer',表示自动推断。如果文件中没有列名,可以设置为'None'。
同时切记一下如果读取的文件与pandas的格式不一样,就会出现报错的现象,解决就需要查看文件的问题,如果无法找到问题,那么就需要使用error_bad_lines=False
参数,但是这个参数会导致部分数据的丢失,因此最好检查并修复数据文件。
导入文件的格式如下
import pandas as pd
df1 = pd.read_csv('test_data.csv', header=None)
df1.columns = ['c1', 'c2', 'c3', 'c4']
print(df1)
#结果为
"""
c1 c2 c3 c4
0 5.1 NaN 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 NaN 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5
5 6.9 3.1 4.9 NaN
6 ''' NaN NaN NaN
"""
然后这里的数据就有缺失的情况
这里将缺失的数据进行处理
dropna函数
axis
参数
格式如下
import pandas as pd
df1 = pd.read_csv('test_data.csv', header=None)
df1.columns = ['c1', 'c2', 'c3', 'c4']
print(df1)#这里将没有处理前的数据打印出来进行对比
#缺失值处理
df = df1.dropna(axis=1)#这里将丢失的文件内容,按列进行处理
print(df)
#结果为
"""
c1 c2 c3 c4
0 5.1 NaN 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 NaN 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5
5 6.9 3.1 4.9 NaN#没处理前的数据
c1
0 5.1
1 4.9
2 4.7
3 7.0
4 6.4
5 6.9#处理后的数据
"""
通过结果可以看出如果哪一列的数据为NaN那么这一整列都会被删除不显示。
之所以按照一整列进行查找和axis
这个参数有关,当这个axis
等于0就按行来进行处理,当这个axis
等于1就按列来进行处理。
axis参数等于0的情况代码如下
import pandas as pd
df1 = pd.read_csv('test_data.csv',header=None)
df1.columns = ['c1', 'c2', 'c3', 'c4']
print(df1)
#缺失值处理
df = df1.dropna(axis=0)#这里将丢失的文件内容,按照行
print(df)
#结果为
"""
c1 c2 c3 c4
0 5.1 NaN 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 NaN 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5
5 6.9 3.1 4.9 NaN#这里是处理前的数据
c1 c2 c3 c4
1 4.9 3.0 1.4 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5#这里是处理后的数据
"""
how
参数
该参数会删除行和列中有NaN的行和列
例子格式如下
import pandas as pd
df = pd.read_csv('test_data.csv',header=None,sep=',')
df.columns = ['c1', 'c2', 'c3', 'c4']
print(df)
df = df.dropna(how='all')
print(df)
#结果为
"""
#修改前
c1 c2 c3 c4
0 5.1 NaN 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 NaN 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5
5 6.9 3.1 4.9 NaN
#修改后
c1 c2 c3 c4
0 5.1 NaN 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 NaN 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5
5 6.9 3.1 4.9 NaN
"""
how
参数有两个值,第一个any
值是默认值,表示只要某一行或列中存在任何缺失值,就删除该行或列。
第二个all
值,表示只有当某一行或列中的所有值都是缺失值时,才删除该行或列。
thresh
参数
该参数用于指定非缺失值的最小数量,当某一行或列的非缺失值小于这个最小数量,该行或列将被删除。
例子如下
import pandas as pd
df = pd.read_csv('test_data.csv',header=None, sep=',')
df.columns = ['c1', 'c2', 'c3', 'c4']
print(df)#修改前的数据
df = df.dropna(thresh=4)#这里添加一个限制,当某一行或列缺失值小于这个量就将其删除掉
print(df)#修改后的数据
#结果为
"""
#修改前的数据
c1 c2 c3 c4
0 5.1 NaN 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 NaN 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5
5 6.9 3.1 4.9 NaN
#修改后的数据
c1 c2 c3 c4
1 4.9 3.0 1.4 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5"""
subset
参数
该参数用于指定应该考虑哪些列或行来进行缺失值的删除。具体就是subset
参数允许指定特定的行或列的标签
指定列的情况
例子格式如下
import pandas as pd
df = pd.read_csv('test_data.csv', header=None, sep=',')
df.columns = ['c1', 'c2', 'c3', 'c4']
print(df)#修改前的数据
df = df.dropna(subset=['c2'])#从列c2删除带有NaN值的行
print(df)#修改后的数据
#结果为
"""
#修改前的数据
c1 c2 c3 c4
0 5.1 NaN 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 NaN 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5
5 6.9 3.1 4.9 NaN
#修改后的数据
c1 c2 c3 c4
1 4.9 3.0 1.4 0.2
2 4.7 3.2 NaN 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5
5 6.9 3.1 4.9 NaN
"""
subset参数在判断c2列是,c2列的0行有NaN的值所以整个行都删除了。
注意一定的是subset
参数主要用于选择特定的列来进行缺失值的处理,而不是用于选择特定的行
给NaN值进行填充
填充需要用到一个方法fillna
例子如下
import pandas as pd
df = pd.read_csv('test_data.csv', header=None,sep=',')
df.columns = ['c1', 'c2', 'c3', 'c4']
print(df)#修改前的数据
df = df.fillna(value="jun")#这里将jun这个数据替换掉NaN值
print(df)#修改后的数据
#结果为
"""
#修改前的数据
c1 c2 c3 c4
0 5.1 NaN 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 NaN 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5
5 6.9 3.1 4.9 NaN
#修改后的数据
c1 c2 c3 c4
0 5.1 jun 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 jun 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5
5 6.9 3.1 4.9 jun
"""
合并数据
首先用pandas模块和numpy模块生成一个行为3,列为3的数组
例子如下
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.zeros((3,3)))#这里将numpy模块生成的数组添加到pandas的多维里面,不过zeros生成的数组元素初始化都是零
print(df1)
df2 = pd.DataFrame(np.ones((2,3)))#这里将numpy模块生成的数组添加到pandas的多维里面,不过ones生成的数组元素初始化都是一
print(df2)
#结果为
"""
#zeros生成的
0 1 2
0 0.0 0.0 0.0
1 0.0 0.0 0.0
2 0.0 0.0 0.0
#ones生成的
0 1 2
0 1.0 1.0 1.0
1 1.0 1.0 1.0
"""
上面的代码注意一下就是zeros
和ones
这里两个方法都是用于创建数组,只是两者创建的数组里面的元素初始化值是不一样的。
concat
方法合并例子代码如下
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.zeros((3,3)))#这里将numpy模块生成的数组添加到pandas的多维里面,不过zeros生成的数组元素初始化都是零
print(df1)
df2 = pd.DataFrame(np.ones((2,3)))#这里将numpy模块生成的数组添加到pandas的多维里面,不过ones生成的数组元素初始化都是一
print(df2)
df3 = pd.concat((df1,df2))#使用concat方法将这两个数组进行合并
print(df3)
#结果如下
"""
#zeros生成的
0 1 2
0 0.0 0.0 0.0
1 0.0 0.0 0.0
2 0.0 0.0 0.0
#ones生成的
0 1 2
0 1.0 1.0 1.0
1 1.0 1.0 1.0
#使用concat方法后的结果
0 1 2
0 0.0 0.0 0.0
1 0.0 0.0 0.0
2 0.0 0.0 0.0
0 1.0 1.0 1.0
1 1.0 1.0 1.0
"""
这里的合并使用了concat
这个方法,该方法内有一个参数axis
决定它按照什么形式进行合并。
1、axis=0(默认值):
- 在纵向(垂直)方向上进行连接,即沿着行的方向连接。
- 对于DataFrame,表示按行连接,增加行数。
2、axis=1:
- 在横向(水平)方向上进行连接,即沿着列的方向连接。
- 对于DataFrame,表示按列连接,增加列数。
axis=0和1的例子代码:
#合并处理
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.zeros((3,3)))#这里将numpy模块生成的数组添加到pandas的多维里面,不过zeros生成的数组元素初始化都是零
print(df1)
df2 = pd.DataFrame(np.ones((2,3)))#这里将numpy模块生成的数组添加到pandas的多维里面,不过ones生成的数组元素初始化都是一
print(df2)
df3 = pd.concat((df1, df2), axis=0)#使用concat方法将这两个数组进行合并
print(df3)#这里输出axis参数等于零的情况
df4 = pd.concat((df1, df2), axis=1)#使用concat方法将这两个数组进行合并
print(df4)#这里输出axis参数等于一的情况
#结果为
"""
#zeros生成的数组
0 1 2
0 0.0 0.0 0.0
1 0.0 0.0 0.0
2 0.0 0.0 0.0
#ones生成的数组
0 1 2
0 1.0 1.0 1.0
1 1.0 1.0 1.0
#这里是concat方法参数axis等于零的情况
0 1 2
0 0.0 0.0 0.0
1 0.0 0.0 0.0
2 0.0 0.0 0.0
0 1.0 1.0 1.0
1 1.0 1.0 1.0
#这里是concat方法参数axis等于一的情况
0 1 2 0 1 2
0 0.0 0.0 0.0 1.0 1.0 1.0
1 0.0 0.0 0.0 1.0 1.0 1.0
2 0.0 0.0 0.0 NaN NaN NaN
"""
_append
方法合并例子
代码如下
import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.zeros((2, 3)))
df2 = pd.DataFrame(np.ones((3, 2)))
print(df1)
print(df2)
df3 = df1._append(df2)# 这里使用append合并列
print(df3)
#结果为
"""
#zeros生成的数组
0 1 2
0 0.0 0.0 0.0
1 0.0 0.0 0.0
#ones生成的数组
0 1
0 1.0 1.0
1 1.0 1.0
2 1.0 1.0
3 1.0 1.0
4 1.0 1.0
#这里使用_append进行合并
0 1 2
0 0.0 0.0 0.0
1 0.0 0.0 0.0
0 1.0 1.0 NaN
1 1.0 1.0 NaN
2 1.0 1.0 NaN
3 1.0 1.0 NaN
4 1.0 1.0 NaN
"""
该方法的合并就是将这两个数组直接合并,行与行合并,列与列合并。
导入导出数据
1.读取文件
主要的格式
read_文件类型(参数)
参数表格
参数 | 详解 |
---|---|
sep | 指定分隔符,可用正则表达式如'\s+' |
header=None | 指定文件无行名 |
name | 指定列名 |
index_col | 指定某列作为索引 |
skip_row | 指定跳过某些行 |
na_values | 指定某些字符串表示缺失值 |
parse_dates | 指定某些列是否被解析为日期,布尔值或列表 |
- CSV 文件:
- 使用
pd.read_csv
读取逗号分隔的文本文件。 - 示例:
pd.read_csv('file.csv')
- 使用
- Excel 文件:
- 使用
pd.read_excel
读取 Excel 文件。 - 示例:
pd.read_excel('file.xlsx')
- 使用
- JSON 文件:
- 使用
pd.read_json
读取 JSON 文件。 - 示例:
pd.read_json('file.json')
- 使用
- SQL 数据库:
- 使用
pd.read_sql
从 SQL 数据库读取数据。 - 示例:
pd.read_sql('SELECT * FROM table', connection)
- 使用
- HTML 表格:
- 使用
pd.read_html
从 HTML 表格中提取数据。 - 示例:
tables = pd.read_html('url or file')
- 使用
- Parquet 文件:
- 使用
pd.read_parquet
读取 Apache Parquet 文件。 - 示例:
pd.read_parquet('file.parquet')
- 使用
- Feather 文件:
- 使用
pd.read_feather
读取 Feather 文件。 - 示例:
pd.read_feather('file.feather')
- 使用
- HDF5 文件:
- 使用
pd.read_hdf
读取 HDF5 文件。 - 示例:
pd.read_hdf('file.h5')
- 使用
- Msgpack 文件:
- 使用
pd.read_msgpack
读取 Msgpack 文件。 - 示例:
pd.read_msgpack('file.msg')
- 使用
- Stata 文件:
- 使用
pd.read_stata
读取 Stata 文件。 - 示例:
pd.read_stata('file.dta')
- 使用
例子如下
# 导入数据(csv文件例子)
import pandas as pd
df1 = pd.read_csv('test_data.csv', header=None)
print(df1)
#结果为
"""
0 1 2 3
0 5.1 NaN 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 NaN 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5
5 6.9 3.1 4.9 NaN
"""
2.写入文件
这里以csv文件为例子
导出文件
import pandas as pd
df = pd.read_csv('test_data.csv', header=None)
df1 = df.dropna(how='any')
print(df1)#将缺失值删除后的数据打印查看
# df1.to_csv('test1.csv')
df1.index = ['第一行', '第二行', '第三行']#给新文件的行进行更换
df1.columns = ['第一列', '第二列', '第三列', '第四列']#给新文件的列进行更换
print(df1)#这里将更换后的数据打印查看
df1.to_csv('test1.csv')#这里将文件导出
#结果为
"""
#这是缺失值处理后的情况
0 1 2 3
1 4.9 3.0 1.4 0.2
3 7.0 3.2 4.7 1.4
4 6.4 3.2 4.5 1.5
#这是更换后的情况
第一列 第二列 第三列 第四列
第一行 4.9 3.0 1.4 0.2
第二行 7.0 3.2 4.7 1.4
第三行 6.4 3.2 4.5 1.5
"""
文件导出的图片
上面是不带参数的情况
导出文件方法参数的情况
参数 | 详解 |
---|---|
sep | 分隔符的指定,用于指定用什么分隔符 |
na_rep | 指定缺失值转换的字符串,默认为空字符串 |
header=False/True | 当此参数等于False时导出的文件不会将列名一起导出,当此参数等于True时导出的文件会将列名一起导出(默认值是True) |
index=False/True | 当此参数等于False时导出的文件不会将行名一起导出,当此参数等于True时导出的文件会将行名一起导出(默认值是True) |
cols | 指定输出的列,传入列表 |
主要的参数有sep
、header
、index
这三个
pandas读取json文件
虽然pandas可以读取json文件,但是一般情况是不用它的。
基本的格式如下
import pandas as pd
strtext = '[{"ttery":"min","issue":"20130801-3391","code":"8,4,5,2,9","code1":"297734529","code2":null,"time":1013395466000},\
{"ttery":"min","issue":"20130801-3390","code":"7,8,2,1,2","code1":"298058212","code2":null,"time":1013395406000},\
{"ttery":"min","issue":"20130801-3389","code":"5,9,1,2,9","code1":"298329129","code2":null,"time":1013395346000},\
{"ttery":"min","issue":"20130801-3388","code":"3,8,7,3,3","code1":"298588733","code2":null,"time":1013395286000},\
{"ttery":"min","issue":"20130801-3387","code":"0,8,5,2,7","code1":"298818527","code2":null,"time":1013395226000}]'
df = pd.read_json(strtext, orient='records')#这里进行读取
print(df)
#结果为
"""
ttery issue code code1 code2 time
0 min 20130801-3391 8,4,5,2,9 297734529 NaN 1013395466000
1 min 20130801-3390 7,8,2,1,2 298058212 NaN 1013395406000
2 min 20130801-3389 5,9,1,2,9 298329129 NaN 1013395346000
3 min 20130801-3388 3,8,7,3,3 298588733 NaN 1013395286000
4 min 20130801-3387 0,8,5,2,7 298818527 NaN 1013395226000
"""
在方法read_json
方法中有一个参数orient
,它有五个值,然后这五个值对应着读取时不同的形式
参数 | 详解 |
---|---|
split | 将JSON对象拆分为表的字典。 |
records | 将JSON数组视为记录的列表。 |
index | 将JSON对象的键视为DataFrame的索引。 |
columns | 将JSON对象的值视为DataFrame的列。 |
values | 将JSON对象的值视为数据。 |
table | 将JSON对象解释为包含表格的对象。 |
None | 自动检测输入的数据结构 |
pandas模块查看类型以及修改类型
在pandas中,可以使用astype
方法来转换列的数据类型,而要查看列的数据类型,可以使用dtype
属性。
这里我有一个需求就是将文件读取的数据类型进行转换成浮点型,同时进行四舍五入保留一位浮点数。
例子如下
def liexi(liexi_data):#这个函数进行数据类型的转换,同时进行四舍五入
# 读取数据
df = pd.read_csv(liexi_data)
# 修改数据'score'列的类型
df['score'] = df['score'].astype(float)
# 将修改后的数据'score'列进行四舍五入保留一位浮点数,需要用到pandas模块里面的round方法
df['score'] = df['score'].round(1)
修改后的情况如下