pandas
数据结构
pandas的基础数据结构,包括各类对象的数据类型,索引,轴标记,对齐等基本操作
数据对齐是内在的,这一原则是根本,除非显式指定,pandas不会断开标签和数据之间的连接
1.Series
Series是一个带标签的一维数组,可存储整数,浮点数,字符串,python对象等类型的数据,轴标签统称为索引,调用pd.Series函数即可创建Series
创建Series对象
# Series参数
data=None, index=None, dtype=None, name=None, copy=False, fastpath=False
方法一:使用数组形式创建
s = pd.Series(data,index=index)
# demon s = pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
# data支持的数据类型
python字典
多维数组
标量值(如,5) 只有一个值,这一行的值都是这一个
方法二:使用字典形式创建
s = pd.Series({'a':1,'b':2,'c':3})
# data为字典且未设置index参数时,python版本>=3.6,Series按字典的插入顺序排序索引
a 1
c 2
b 3
s = pd.Series({'a':1,'c':2,'b':3},index=['a','b','c','d','e'])
# 如果设置了index参数,则按索引标签提取data中对应的值,如果data中有,索引中没有,将不传递显示
a 1.0
b 3.0
c 2.0
d NaN
e NaN
# pandas用NaN表示缺失数据
方法三:当data为标量值时
s = pd.Series(5,index=['a','b','c','d','e'])
# 当data为标量值时,必须提供索引,Series按索引长度重复该标量值
a 5
b 5
c 5
d 5
e 5
基本操作
切片
s[0:1] # 对值进行切片,前开后闭
a 1.0
b 3.0
s = pd.Series({'a':1,'c':2,'b':3},index=['a','b','c','d','e'])
s[[4,3,1]] # 取索引为4,3,1的值
e NaN
d NaN
b 3.0
array操作
s = pd.Series({'a':1,'c':2,'b':3},index=['a','b','c','d','e'])
s.array
# 执行不用索引的操作时,如禁用自动对齐,访问数组非常有用,Series.array一般使扩展数组,
<PandasArray>
[1.0, 3.0, 2.0, nan, nan] # 如果值中有nan,也会显示,可以使用 dropna 函数清除
Length: 5, dtype: float64
s = pd.Series({'a':1,'c':2,'b':3})
s.to_numpy()
# 提取真正的多维数组,要用Series.to_numpy()
array([1, 2], dtype=int64)
# Series时扩展数组,Series.to_numpy()返回的时NumPy多维数组
Series对象取值
s['a'] 或 s[0]
Series类似于字典,可以用索引标签取值或设置值,如果引用Series里没有的标签回触发异常,使用get可以提取没有的标签,返回None或指定默认值
矢量操作
s + s
s * 2
# Series和多维数组的主要区别在于,Series之间的操作会自动基于标签对齐数据,因此不用顾及执行计算操作的Series是否有相同的标签,总之,让不同索引对象操作的默认结果生成索引并集,是为了避免信息丢失,就算确实了数据,索引标签依然包含计算的重要信息,当然也可所以用 dropna 函数清除含有确实值的标签
名称属性
Series支持 name
属性
s = pd.Series(np.random.randn(5),name='something')
Out[33]:
0 -0.314390
1 -0.305942
2 0.440155
3 -0.800408
4 0.721798
Name: something, dtype: float64
# 如果没有指定name属性,查询的时候是没有name属性的
s.name # 查询name
s.rename # 重命名Series
2.DataFrame
创建DataFrame对象
DataFrame是由多种类型的列构成的二维标签数据结构,类似于Excel,SQL表,或Series对象后成的字典,DataFrame是最常用的Pandas对象,与Series一样,DataFrame支持多种类型的输出数据:
# DataFrame 支持的输入数据类型
一维ndarry,列表,字典,Series字典
二维numpy.ndarry
结构多维数组或记录多维数据
Series
DataFrame
除了数据,还可以有选择地传递 index 行标签和 columns 列标签参数,传递了索引或列,就可以确保生成的DataFrame里包含索引或列,Series字典加上指定索引时,会丢弃与传递的索引不匹配的所有数据,没有传递轴标签时,按常规依据输入数据进行构建。
# 注意
python>=3.6,且pandas>=0.23,数据是字典,且未指定 columns 参数时, DataFrame 的列按字典的插入顺序排序
# DataFrame参数
self, data=None, index=None, columns=None, dtype=None, copy=False
用Series字典或字典生成DataFrame(用字典生成)
df = pd.DataFrame({'one':pd.Series([1,2,3,4,5],index=['a','b','c','d','e']),'two':{'a':6,'c':8,'f':9}})
one two
a 1 6.0
b 2 NaN
c 3 8.0
d 4 NaN
e 5 NaN
f Nan 9.0
# 1.生成的索引是每一个Series索引的并集,先把套接字典转换成Series,如果没有指定列,DataFrame的列就是字典键的有序列表
# 2.index 和columns 属性分别用于访问行,列标签,指定列与数据字典一起传递时,传递的列会覆盖掉字典的键
# 3.如果有一列有指定的行索引,并且另一列与这一列的索引有相似的部分,呢会将这两列的索引进行合并,缺失的地方使用Nan替换掉
用多维数组字典,列表字典生成DataFrame(用字典生成)
df = pd.DataFrame({'one':[1,2,3,4,5],'two':[6,7,8,9,0]},index=['a','b','c','d','e'])
用列表字典生成DataFrame(用字典生成)
df = pd.DataFrame([{'a':1,'b':2,'c':3},{'b':5}],index=['first','second'])
a b c
first 1.0 2 3.0
second NaN 5 NaN
用包含日期时间索引与标签的NumPy数组生成DataFrame(随机数生成)
In [5]: dates = pd.date_range('20130101', periods=6)
In [6]: dates
Out[6]:
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
In [7]: df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
In [8]: df
Out[8]:
A B C D
2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
2013-01-02 1.212112 -0.173215 0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
2013-01-04 0.721555 -0.706771 -1.039575 0.271860
2013-01-05 -0.424972 0.567020 0.276232 -1.087401
2013-01-06 -0.673690 0.113648 -1.478427 0.524988
用Series字典对象生成DataFrame(字典生成)
In [9]: df2 = pd.DataFrame({'A': 1.,
...: 'B': pd.Timestamp('20130102'),
...: 'C': pd.Series(1, index=list(range(4)), dtype='float32'),
...: 'D': np.array([3] * 4, dtype='int32'),
...: 'E': pd.Categorical(["test", "train", "test", "train"]),
...: 'F': 'foo'})
...:
In [10]: df2
Out[10]:
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo
用Series创建DataFrame
生成的DataFrame继承了输入的Series的索引,如果没有指定列名,默认列名是输入Series的名称
df = pd.DataFrame(
[pd.Series({'a':1,'b':2},index=['a','c','d']),
pd.Series({'a':1,'b':2,'d':4},index=['a','c','d'])])
a c d
0 1.0 NaN NaN
1 1.0 NaN 4.0
DataFrame常用操作
提取 添加 删除列
# DataFrame就像带索引的Series字典,提取,设置,删除列的操作与字典类似
df = pd.DataFrame([{'a':1,'b':2,'c':3},{'b':5}],index=['first','second'])
************************* 提取 *************************
df['b'] # 提取 b 列的内容
first 2
second 5
Name: b, dtype: int64
************************* 删除 *************************
del df['a'] # 删除指定列
b c
first 2 3.0
second 5 NaN
df1 = df.pop('a') # 获取指定的删除列
first 1.0
second NaN
Name: a, dtype: float64
************************* 添加 *************************
df['three'] = [11,22]
a b c three
first 1.0 2 3.0 11
second NaN 5 NaN 22
# 可以插入原生多维数组,但长度必须与DataFrame索引长度一致,默认在DataFrame为不插入列,insert 函数可以指定插入列的位置
df.insert(1, 'bar', df['one']) # 在第一行插入列名为 bar ,值为df['one']的数据
one bar flag foo one_trunc
a 1.0 1.0 False bar 1.0
b 2.0 2.0 False bar 2.0
c 3.0 3.0 True bar NaN
d NaN NaN False bar NaN
用方法链分配新列
DataFrame 提供了 assign() 方法,可以利用现有的列创建新列
df = pd.DataFrame({'one':[1,2,3,4,5],'two':[6,7,8,9,0]},index=['a','b','c','d','e'])
df1 = df.assign(three=df['one']*2)
df1
one two three
a 1 6 2
b 2 7 4
c 3 8 6
d 4 9 8
e 5 0 10
# assign 返回的是数据副本,原DataFrame不变,可以使用assign执行一些数据操作之类数据进行返回
# assign 函数的签名就是 **kwargs,键是新字段的列名,值为插入值
# assign 在pythn3.6之后可以保存 **kwargs 顺序,**kwargs 后的表达式可以引用同一个assign 函数里之前创建的列
索引/选择
操作 | 句法 | 结果 |
---|---|---|
选择列 | df[col] | Series |
用标签选择行 | df.loc[label] | Series |
用整数位置选择行 | df.iloc[loc] | Series |
行切片 | df[1:3] | DataFrame |
用布尔向量选择行 | df[bool_vec] | DataFrame |
数据对齐和运算
DataFrame对象可以自动对齐 **列与索引列(行标签) **的数据,生成的结果是列和行标签的并集
转置
T 属性可以转置 DataFrame ,相当于把行和列转换位置,但是所对应的值不变
df.T
控制台显示
df.info() # info() 函数可以查看DataFrame的信息摘要
df.to_string() # 以表格的形式返回DataFrame的字符串表示形式
常用操作
查看数据
numpy和pandas的区别:Numpy数组只有一种数据里类型,DataFrame每列的数据类型各不相同
df.head() # 默认显示5行
df.tail(3) # 显示最后三行
df.index # 显示索引名
df.columns # 显示列名
df.to_numpy()
# 返回一个array对象,DataFrame的列由多种数据类型组成时,该操作耗费系统资源比较大,df.to_numpy()的输出不包含行索引和列索引
df.describe() # 快速查看数据的统计摘要
df.T # 转置数据
df.sort_index(axis=1,ascending=False) # 转轴排序
df.sort_values(by='B') # 按值排序
选择数据
推荐使用优化过的Pandas数据访问方法 .at .iat .loc .iloc
# 按标签选
df.A # 获取单列,产生Series对象
df['A'] # 获取单列,产生Series对象
df[1:3] # 用[]切片行
df.loc[] # 按标签取值,第一个参数是行,第二个参数是列
In [30]: df.loc[dates[0], 'A']
Out[30]: 0.46911229990718628
# 按位置选
df.iloc[3] # 第一个参数是第几行,第二个参数是低级列
df.iloc[3:5, 0:2] # 切片取值
df.iloc[[1, 2, 4], [0, 2]] # 用整数列表按位置切片,取出1,2,4行,0,2列
df.iloc[1, 1] # 显式提取值
# 布尔索引
df[df > 0] # 会在全表中选出判断结果为True的值,不满足条件的使用NaN填充
df2 = df.copy() # 将df的值拷贝一份
df[df['E'].isin(['test'])] # 取 df 的 E 列中含有 test 值的行
赋值
# 用索引自动对齐新增列的数据
s1 = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range('20130102', periods=6))
df['F'] = s1
# 按标签赋值
df.at[1,'B'] = 111 # 将第一行,B列的值改为111
# 按位置赋值
df.iat[0,1] = 222 # 将第0行,第1列的值改为222
# 用where条件赋值
df[df > 0] = 111 # 将df中值大于0的更改为111
缺失值
Pandas 主要用 np.nan
表示缺失数据,计算时,默认不包含空值,
重建索引(reindex)可以更改,添加,删除指定轴的索引,并返回数据福本,即不更改原数据
df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
删除所有缺失值的行
df.dropna(how='any') # 删除所有含缺失值的行
填充缺失值
df.fillna(value=5555)
提取 nan
值的布尔掩码
pd.isna(df1) # 对所有值进行判断,如果是nan就为True,不是就为False
方法解析
pandas中fillna()方法,能够使用指定的方法填充NA/NaN值。
# 函数形式
fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
# 参数说明
value:用于填充的空值的值。
method: {'backfill', 'bfill', 'pad', 'ffill', None}, default None。定义了填充空值的方法, pad / ffill表示用前面行/列的值,填充当前行/列的空值, backfill / bfill表示用后面行/列的值,填充当前行/列的空值。
# ffill axis=1 使用前边一列值填充,bfill,axis=1 使用后一列值填充
axis:轴。 0或'index',表示按行删除;1或'columns',表示按列删除。
inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。
limit:int, default None。如果method被指定,对于连续的空值,这段连续区域,最多填充前 limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)
downcast:dict, default is None,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。
运算
apply函数
df.apply(lambda x: x.max() - x.min()) # 可以在apply中定义匿名函数使用
字符串方法
Series 的 str 属性包含一组字符串处理功能,str 的模式匹配默认使用正则表达式
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
s.str.lower()
合并(Merge)
结合(concat)
pandas 提供了多种将Series,DataFrame对象组合在一起的功能,用索引与关联代数功能的多种设置逻辑可执行连接(join)与合并(merge)操作
连接(join)
追加(append)
分组(grouping)
group by 指的是涵盖下列一项或多项步骤的处理流程
分割 :按条件把数据分割成多组
应用 :为每组单独应用函数
组合:将处理结果结合成一个数据结构
重塑(reshaping)
堆叠(stack)
数据透视表(pivot tables)
时间序列(timeseries)
rng = pd.date_range('20200101',periods=10,freq='S')
ts = pd.Series(np.random.randint(0,100,len(rng)),index=rng)
# 时区表示
ts.tz_localize('UTC')
# 转换成其他时区
ts_utc.tz_convert('US/Eastern')
# 转换时间段
类别型(categoricals)
可视化
DataFrame的 plot() 方法可以快速绘制所有带标签的列
数据输入/输出
CSV
read_csv()
# 读取csv文件
pd.read_csv('foo.csv')
# 参数说明
filepath_or_buffer: FilePathOrBuffer, ******* # 文件名或位置
sep=default_sep, # 分隔符
delimiter=None,
# 1.列和索引的位置和名称
header="infer",
names=None,
index_col=None, *******# 用作索引的列编号或者列名
usecols=None, *******# 返回数据子集,例:[0,1,2]或者 [‘foo’, ‘bar’, ‘baz’]
squeeze=False,
prefix=None, *******# 在没有列标题的时候,给列添加前缀
mangle_dupe_cols=True, # 将重复的列表示为X.0, X.1, X.2, 如果设定为false,会将所有重复的列名覆盖掉
# 2.常规解析配置
dtype=None, # 每一类数据的数据类型
engine=None,
converters=None, # 列转换函数的字典,key可以是列名或者列的序号
true_values=None,
false_values=None,
skipinitialspace=False,
skiprows=None,
skipfooter=0,
nrows=None, # 需要读取的行数(从文件头开始算起)
# 3.不适用和缺失数据处理
na_values=None,
keep_default_na=True,
na_filter=True, # 检查是否丢失值(空字符串或空值),对于数据集中没有空值,设定False可以提升读取速度
verbose=False,
skip_blank_lines=True, # 如果为True,则跳过空行,否则记为NaN
# 4.日期时间处理
parse_dates=False,
infer_datetime_format=False,
keep_date_col=False,
date_parser=None,
dayfirst=False,
cache_dates=True,
# 5.迭代
iterator=False,
chunksize=None,
# 6.报价,压缩和文件格式
compression="infer",
thousands=None, # 千分位分隔符
decimal=b".", # 字符中的小数点
lineterminator=None,
quotechar='"',
quoting=csv.QUOTE_MINIMAL,
doublequote=True,
escapechar=None,
comment=None,
encoding=None, *******# 指定字符集类型,通常指定为'utf-8'
dialect=None,
# 7.错误处理
error_bad_lines=True,
warn_bad_lines=True,
# 8.内部
delim_whitespace=False,
low_memory=_c_parser_defaults["low_memory"],
memory_map=False,
float_precision=None,
to_csv()
# 写入CSV文件
df.to_csv('foo.csv')
# 参数说明
path_or_buf=None, # 路径
sep=",", # 分隔符
na_rep="", # 替换空值,缺失值保存为Na,如果不写,默认为空
float_format=None, # 格式,float_format='%.2f' 保留两位小数
columns=None, # 是否保留某列的值, columns=['name'] 保存索引列和name的值
header=True, # 是否保留列名,False不保留列名
index=True, # 是否保留索引行,False不保留
index_label=None,
mode="w", # 如果需要在现有文件中追加,把 w 改成 a,前提是格式都一样
encoding=None,
compression="infer",
quoting=None,
quotechar='"',
line_terminator=None,
chunksize=None,
date_format=None,
doublequote=True,
escapechar=None,
decimal=".",
HDF5
# 读取HDF5文件
pd.read_hdf('foo.h5', 'df')
# 写入HDF5
df.to_hdf('foo.h5', 'df')
Excel
# 读取Excel文件
pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
# 写入Excel
df.to_excel('foo.xlsx', sheet_name='Sheet1')
to_msgpack
pandas.DataFrame.to_msgpack(path=None,encoding='utf-8',**kwargs)
msgpack(序列化)对象以输入文件路径
# 参数说明
path 字符串文件路径,类似缓冲区的文件或无,如果为None,则返回生成的字符串
append 布尔值是否追加到现有的msgpack,默认为False
compress 压缩器的类型(zlib或blosc)默认为None(无压缩)
基础用法
df.columns = ['a','b','c'] # 更换列的值
df.array() # 用于提取数据,推荐使用
df.to_numpy() # 用于提取数据,推荐使用
df.rename(columns={'adj_price_open': 'price_open'}, inplace=True) # 更改列名
inplace=True # 不创建新的对象,直接对原始对象进行修改
inplace=False # 对数据进行修改,创建并返回新的对象承载其修改结果
合并重叠数据集
合并两个相似的数据集,一个中的数据比另一个多,合并后选择覆盖范围广的,使用 combin_first()
函数
In [71]: df1 = pd.DataFrame({'A': [1., np.nan, 3., 5., np.nan],
....: 'B': [np.nan, 2., 3., np.nan, 6.]})
....:
In [72]: df2 = pd.DataFrame({'A': [5., 2., 4., np.nan, 3., 7.],
....: 'B': [np.nan, np.nan, 3., 4., 6., 8.]})
....:
In [73]: df1
Out[73]:
A B
0 1.0 NaN
1 NaN 2.0
2 3.0 3.0
3 5.0 NaN
4 NaN 6.0
In [74]: df2
Out[74]:
A B
0 5.0 NaN
1 2.0 NaN
2 4.0 3.0
3 NaN 4.0
4 3.0 6.0
5 7.0 8.0
In [75]: df1.combine_first(df2)
Out[75]:
A B
0 1.0 NaN
1 2.0 2.0
2 3.0 3.0
3 5.0 4.0
4 3.0 6.0
5 7.0 8.0
聚合函数使用
sum() # 求和
mean() # 返回平均值
std() # 返回标准差
median() # 所有值的中位数
min() # 最小值
max() # 最大值
abs() # 绝对值
prod() # 数据元素的乘积
cumsum() # 累计总和
describe() # 统计信息摘要
索引
重建索引
重建索引会更改DataFrame的行标签和列标签,重新索引以为这符合数据以匹配特定轴上的一组给定的标签,可以通过索引实现多个操作
- 重新排序现有数据以匹配一组新的标签
- 在没有标签数据的标签位置插入缺失值标记
df.reindex(index=[]) # 重建索引,如果指定的数据没有和此索引建立关联,新产生的表格就为NaN
df.rename(index=[], columns=[]) # 索引重命名
迭代
iteritems() - 迭代(key,value)对
iterrows() - 将行迭代为(索引,系列)对
itertuples() - 以namedtuples的形式迭代行
排序
pandas排序有两种:按标签 按实际值
df.sort_index() # 按标签排
df.sort_index(ascending=False) # 排序顺序
df.sort_index(axis=1) # 按列排序
df.sort_values(by='B') # 按某一列的值排序
合并连接
Merge方法
# Merge方法是基于共同列将两个dataFrame连接起来
pd.merge(left,right,how="inner",on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=False,
suffixes # 合表中遇到相同的列名,给重复的列名增加后缀=("_x", "_y"),copy=True,indicator=False,validate=None,)
# 参数说明
left/right # 左右位置的dataframe
how # 合并方式 left:基于左边dataframe列的数据合并,right:基于右边,outer:两者并集,inner,两者交集,默认是inner
on # 用来合并的列名,这个参数需要保证两个dataframe有相同的列名
left_on/right_on # 左右dataframe合并的列名,也可以为索引,数组和列表
left_index/right_index # 是否以index作为数据合并的列名,True表示是
sort # 根据dataframe合并的keys排序,默认是
suffixes # 合表中遇到相同的列名,给重复的列名增加后缀
on参数:在实际应用中,如果右表的索引值正是左表的某一列的值,这时可以通过将右表的索引和左表的列对其合并,这样灵活的方式进行合并
In [59]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
....: 'B': ['B0', 'B1', 'B2', 'B3'],
....: 'key': ['K0', 'K1', 'K0', 'K1']})
....:
In [60]: right = pd.DataFrame({'C': ['C0', 'C1'],
....: 'D': ['D0', 'D1']},
....: index=['K0', 'K1'])
result = left.join(right,on='Key')
suffix后缀参数:如果和表合并的过程中遇到有一列两个表都同名,但是值不同,合并的时候又都想保留下来,就可以用suffixes给每个表的重复列名增加后缀。
result = pd.merge(left, right, on='k', suffixes=['_l', '_r'])
组合多个dataframe:一次组合多个dataframe的时候可以传入元素为dataframe的列表或者tuple。
right2 = pd.DataFrame({'v': [7, 8, 9]}, index=['K1', 'K1', 'K2'])
result = left.join([right, right2])
concat方法
concat方法是拼接函数,有行拼接和列拼接,默认是行拼接,拼接方式默认的是外拼接(并集),拼接对象是pandas数据类型
pd.concat(objs,axis=0,join="outer",join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False,sort=None,copy=True)
# 参数说明:
objs:series,dtaframe或者panel构成的序列list,需要可迭代
axis:需要合并连接的轴,0是行,1是列
join:连接的方式,或者outer, inner:两表的交集,outer:两者的并集
keys:当axis=0的时候,按照行拼接,会加一列,表示这一列是哪一个表中的数据;axis=1的时候,按照列拼接, 会将列名改为对应的值,表示这一列是哪一个表中的数据
join_axes:指定根据那个轴来对齐数据 join_axes=[df.index]
ignore_index:设置为True,合并的两个表就会根据列字段对齐,然后合并,最后再重新整理一个新的index
********************** Series类型的拼接方法 **********************
# 例1:行拼接
df1 = pd.Series([1.1,2.2,3.3],index=['i1','i2','i3'])
df2 = pd.Series([4.4,5.5,6.6],index=['i2','i3','i4'])
pd.concat([df1,df2])
行拼接如果有相同的索引,为了区分索引,我们在最外层定义了索引的分组情况
# 对行拼接分组
pd.concat([df1,df2],keys=['fea1','fea2'])
# 例2:列拼接
默认以并集的方式拼接
pd.concat([df1,df2],axis=1) # axis=0 行拼接 axis=1 列拼接
列拼接的内连接(交),取相同的部分
pd.concat([df1,df2],axis=1,join='inner')
设置列拼接的列名(交)
pd.concat([df1,df2],axis=1,join='inner',keys=['fea1','fea2'])
指定索引[i1,i2,i3]的列拼接
pd.concat([df1,df2],axis=1,join_axes=[['i1','i2','i3']])
********************** DataFrame类型的拼接方法 **********************
# 行拼接
df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3', 'K4', 'K5'], 'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']})
df2 = pd.DataFrame({'key': ['K0', 'K1', 'K2'],'B': ['B0', 'B1', 'B2']})
pd.concat([df1,df2])
# 列拼接
pd.concat([df1,df2],axis=1)
若列拼接或行拼接有重复的列名和行名,则报错
# 判断是否有重复的列名,若有则报错
pd.concat([df1,df2],axis=1,verify_integrity = True)
append方法
dataframe 数据类型的方法,提供了行方向的拼接操作
DataFrame.append(other, ignore_index=False, verify_integrity=False, sort=None)
# 功能说明:
向DataFrame对象中添加新的行,如果添加的列名不在DataFrame对象中,将会被当作新的列进行添加
# 参数说明
other # DataFrame,Series,dict,list这样的数据结构
ignore_index # 默认值为False,如果为True,则不适用index标签
verify_integrity # 默认值为False,如果为True,当创建相同的index时会抛出ValueError的异常
sort # 默认是None
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']})
df3 = df1.append(df2, ignore_index=True) # 如果不使用ignore_index=True,会出现多个相同的索引
result = df1.append([df2, df3]) # 可以添加多个
join方法
dataframe 数据类型的方法,提供了列方向的拼接操作,支持左联,右联,内联,外联四种
DataFrame.join(other, on=None, how=’left’, lsuffix=”, rsuffix=”, sort=False)
# 功能说明
通过索引或者指定的连接两个DataFrame,通过一个list可以一次高效的连接多个DataFrame
# 参数说明
other # DataFrame,或者带有名字的Series,或者DataFrame的list,如果传递的是Series,那么其name属性应当是一个集合,并且该集合将会作为结果DataFrame的列名
on # 列名称,或者列名称的list/tuple,或者类似形状的数组,连接的列,默认使用索引连接
how # {‘left’, ‘right’, ‘outer’, ‘inner’}, default: ‘left’,连接的方式,默认为左连接
lsuffix # string,左DataFrame中重复列的后缀
rsuffix # string,右DataFrame中重复列的后缀
sort # boolean, default False,按照字典顺序对结果在连接键上排序。如果为False,连接键的顺序取决于连接类型(关键字)。
pandas删除行
1.指定删除行数删除 .drop([i,j])
.drop([i,j])方法如果不设置参数inplace=True,则只能在生成的新数据块中实现删除效果,而不能删除原有数据块的相应行,设置后直接在原有的数据块上进行操作
pandas删除列
1.pop()删除 df.pop([指定列])
.pop([])方法可以将所选列从原数据快中弹出,原数据块不在保留该列
2.drop()删除 df.drop([],axis=1)
df.drop([],axis=1) 方法既可以保留原数据块中的所选列,也可以删除,这取决于inplace
当inplace=True时,执行内部删除,不返回任何值,原数据发生变化
当inplace=False,执行内部删除,有返回值,生成新的df
常用方法
df["gender"].unique 查看某一列的唯一值
df["gender"].value_counts(dropna=False) 查看看某一列值分布
df.values 查看数据表的值,返回的是arry对象,列表套列表,一行数据一个小列表
df.rename(columns={"gender":"性别"}) 更改列名称
df['education'].drop_duplicates() 删除后出现的重复值
df['education'].drop_duplicates(keep='last') 删除先出现的重复值
df['education'].replace('本科','大学') 数据替换
merge,join,concat 数据表合并
pd.merge(df1,df2,on='id',how='inner') 交集合并,按照id列
pd.merge(df1,df2,on='id',how='left') 按左边合并
pd.merge(df1,df2,on='id',how='right') 按右边合并
pd.merge(df1,df2,on='id',how='outer') 按照并集合并,两者共同的部分,没有的部分使用Nan替换
merge参数_(self, left, right, how, on, left_on, right_on, axis, left_index, right_index, sort, suffixes, copy, indicator, validate)
result = df.append(df1) 新增
df.set_index('id') 设置索引
df.reset_index(drop=True) 删除索引
df.sort_values(by=['age']) 按照特定的列排序
df.sort_index() 按照索引列排序
# 数据提取
loc:按标签值进行提取 iloc:按位置进行提取
df.columns 获取所有列,返回的是列表的形式
pandas常用函数
# shift() # 对数据进行移动操作,索引不移动
df.shift() # 将本列数据整体向下移动,移动后的空格使用NaN填充
df.shift(-1) # 将本例数据整体向上移动一格,移动后的空格使用NaN填充
# diff() # 两条临近记录的差值
pandas操作文件
import pandas as pd
pd.read_csv(file_path,) 读取csv文件
pd.to_csv(file_path) 写入csv文件
df.astype(int) 将对象转换成int类型
时间戳字符串转换
import time
import datetime
import pandas as pd
# 时间字符串转换成时间戳
a1 = "2019-5-10 23:40:00"
# 先转换为时间数组
timeArray = time.strptime(a1, "%Y-%m-%d %H:%M:%S")
timeStamp = int(time.mktime(time.strptime(a1, "%Y-%m-%d %H:%M:%S")))
print(timeStamp)
# 1557502800
# 字符串转换成时间戳
d = '201703270000'
sss = time.mktime(datetime.datetime.strptime(d, "%Y%m%d%H%M%S").timetuple())
print(sss)
# 1490544000.0
# 时间戳转换成时间字符串
dd = 1490544000.0
dt = pd.to_datetime(dd, unit='s')
print(dt)
# 2017-03-26 16:00:00