pandas——数据处理与分析利器
pandas
pandas是一个用于数据处理和分析的python库。
适宜处理的数据有许多种:
- 表格类,其列甚至可以是异构的。
- 固定频率和无固定频率的时序数据。
- 矩阵,有行标签、列标签的,同构的/异构的。
- 其他形式的统计数据集,不要求其是有标签的。
pandas中两类主要的数据结构,Series
,其是一维的,和DataFrame
,其是二维的。
merge, join, concatenate
串连数据 pd.concat():
pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None,
levels=None, names=None, verify_integrity=False, copy=True)
参数:
objs
待串连的对象(Series
,DataFrame
)。axis
串连轴向,默认0
即将行串连起来。axis=1
即将列串连起来)。
join merge:
join
and merge
do almost same things.
join(, on=,)
merge(, how='inner', left_on='', right_on='', on='')
difference among merge(how=):
(images source: stackoverflow)
如果合并的一个key值在另一个数据中有n个,则会相应被扩展n次。
I/O
CSV
读:pd.read_csv()
,函数。
参数:
filepath_or_buffer
本地文件路径(字符串、pathlib.Path
等类型)、URL(http,ftp,s3等协议)或具有read()
方法的对象。sep
分隔符,默认逗号,
。delimiter
等同参数sep
。delim_whitespace
使用空白符作为分隔符,相当于设置参数sep='\s+'
。names
定义(重定义)列标识(标签),如果文件内容不含表头,则应显式地指定header=None
。header
指定一行以作为列标识(标签),默认值是,当给定names
时为names
,当未给定names
时则是第一行。index_col
指定哪一列以作为行的标识,默认将第一列作为行标识。index_col=False
使得pandas不将第一列作为行标识(这时行标识为读入时的行序号,整型)。usecols
要读的若干列,即仅读取指定的若干列。na_filter
是否判断值有缺失(NaN)。为True
(默认)时将值缺失的单元格填充为np.nan
(NaN);为False
时则不判断,保留为原样即空字符串。
读:pd.read_table()
,函数。
参数:
sep
分隔符,默认\t
。
写: to_csv()
,实例方法,类DataFrame
, Series
。
参数:
path_or_buf
文件路径字符串或文件对象,若是文件对象,则其在被打开时应该指定其参数newline=''
。sep
值分隔符,默认逗号,
。columns
需要被写的若干列,默认所有。header
是否写入列名(表头),默认是(True
)。na_req
缺失值,默认空串。index
是否写入行标识,默认是(True
)。line_terminator
行结束符(记录分隔符),默认平台的换行符。quotechar
引号,默认双引号"
。escapechar
转义符,用以转义quotechar
和sep
,默认无。
Series
Series的长度是不可变的。
[key]
获取值,如果键不存在则抛异常。
.get(key, default=None)
获取值,若键不存在则返回默认值。
fillna()
填充NaN
参数:
value
method
axis
inplace
limit
downcast
map(arg, na_action=None)
参数:
arg
函数、字典、Series
na_action
NaN值的行为,为None
(默认)或'ignore'
。'ignore'
表示不将NaN传入映射,而是将NaN传播到新的Series
中对应的位置上。
isin()
Series的.shape为向量(tuple1),若其元素为向量,该Series也不能构成矩阵,若需矩阵则可用np.stack(.)将该Series转换为矩阵。
文本型Series
接口列表。
s.str.contains('some-word', na=False)。
DataFrame
DataFrame
中的术语"index",指行标识,术语"column"指列。
对于DataFrame
实例,[]
与.loc[]
的异同:
[]
仅是对列的访问,参数可以是列名的list。
.loc[...]
接受1个或2个参数,1个时表示列选择器,2个时分别是行选择器和列选择器(注意此时第一个参数不是列选择器)。
.loc[col-selector]
.loc[row-selector, col-selector]
前者为行(索引)选择器(为单个行标识或多个行组成的列表),后者为列选择器(单个或多个列)。
重置行标识: reset_index()
,该方法将新生成行标识。
参数:
drop
方法默认会保留原来的index,以将其作为新列添加到数据表的第一列(默认列名'index')的方式,为True
时表示不需要保留原index。inplace
为True
时表示在该实例内进行改变(此时方法无返回值);(默认)为False
时表示不改变原实例,满足要求的新实例通过方法返回。
DataFrame()
构造函数
DataFrame(data=None, index: Optional[Collection] = None, columns: Optional[Collection] = None, dtype: Union[str, numpy.dtype, ExtensionDtype, None] = None, copy: bool = False)
参数:
data
: ndarray (structured or homogeneous), Iterable, dict, or DataFrameindex
索引columns
列名
fillna()
填充NaN
可用另外个类似结构的DataFrame来填充自身中的nan值。
参数:
value
- ...
inplace
applymap(func)
元素映射
element-wise map
applymap(func, na_action)
(since v1.2+): na_action
: {None, 'ignore'}, default None; 'ignore': without passing NaN to func
apply(func, axis=0, ...)
沿轴向axis
应用函数func
。
如沿着列向时,则映射函数的实参将是一个行,对映射函数应用列个数次数。
参数:
func
axis
axis=0表示沿行向,axis=1表示沿列向。result_type
值为枚举'expand'
将映射函数返回的序列展开为新数据的列'reduce'
broadcast'
None
默认
args
元组,作为映射函数func
的位置性参数。**kwds
作为func
的命名参数
返回:映射后形成的Series或DataFrame。
sort_values(self, by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False)
Parameters:
by
iterrows()
A generator of items of (index, row). Here is a tuple2 of INDEX and ROW, NOT only row.
rename()
- rename columns:
rename(columns={'old_col1': 'new_col1'})
.combine( other, func)
to perform column-wise combine with another dateframe.
func
: merge function taking two arguments from the coresponding two dataframes.
.combine_first(other)
combine with a non-null-value merge function.
reindex(columns=)
filter and reorder columns.
drop_duplicates(subset=[], keep='first'|'last')
subset
: columns used to identify duplicates.
to_dict(), to_json()
to_json是将其转换为与json相关的字符串。
to_dict是将其转换为dict(json object)相关的对象。
to_dict('records')则转换为[{column:value,...}]形式。
explode()
explode('column') 将其中是多值的列进行展开,如某行的该列的值为数组[1,2]则该行被扩展为2行,对应列的值分别为1、2,其中列的值被复制填充。
一般工具
pd.to_datetime()
,转换为时间类型datetime
,参数:
arg
输入errors
错误数据的处理行为,为字符串'raise'
抛异常。(默认值)'coerse'
设为NaT。'ignore'
返回原输入。
format
格式,形如"%Y-%m-%d",(详见python strftime)
注意事项
- 当一列中int型与None混合时,int值将被自动转为float。
- 当一列中数据(如int型)与
pd.NA
混合时,数据将不会被自动转换。 - 任何值与
pd.NA
作基于等号的等性判定(等于==
、不等于!=
)时返回值为pd.NA
而非布尔值。若想判定值是否为pd.NA
应当使用pd.isna(.)
pandas示例代码:
import pandas as pd
import numpy as np
#这里定义了3行2列的表格,类似“MS Excel”或“WPS表格”应用中的表格
df = pd.DataFrame({
'A':['A1','A2','A3'], #定义列名为A
'B':['B1','B2','B3'] #定义第2列,列名B
})
df = pd.DataFrame({
'A': [1,2,3],
'B': [6,5,4],
'C': [-10, 50, 0]
})
df['A'] #选择列,以列名
#或df.A
df[['A','B']] #选择若干子列
#当DataFrame没有被显式定义列名时,其列名是*整型的*的列序 [0, 1, 2...]
#因此在访问列时方括号内提供的实参是整型,如
df=pd.read_csv('x.csv')
df[1] #选择列,以列的“整数型名字”
df[[1,0]] #选择多列
#这里称之为整数型名字,是因为这个整数是与列绑定的(相当于键值对),而不是列处于表格中的位置索引,如,y=df[[0,4]]选择出两个子列0,4(第1列和第5列)作为表格,如果通过语法`[整数]`方式去访问y的第2列(也就等同df的第5列),则整数实参必须是4,而非目标列处于y的位置索引1。
#当显式定义了列名时则必须用定义的列名,没有整型的列名可用
df=pd.read_csv('xx.csv', header=None, names=['A','B']) #读一个csv文件,其有两列,文件内容中没有表示列名的行(表头)
#这里将其读入,并定义其列名为A,B
#df[0] # <== ERR. 不存在df[0],因为没有名为整型0的列
df.loc[<rows selector>, <columns selector>]
df.iloc[<rows selector>, <columns selector>] #整型实参的选择器将被视为位置索引,而非绑定的整型名字
#df.loc[行选择,列选择] = 更新值
df.loc[df.A>=2, 'B'] = 5 #选择列这样的行,其列A的值大于等于2;对那些行进行这样的操作,使其列B的值为5
df.loc[df.A>=2, ['B','C']] = 10
#df.loc[df.A>=2 and df.B<5] #<==ERR将导致and的语义歧义
#若意图是选择所有这样的行,其中每行各自的(列A满足……列B满足……),应借助np.logical_and/np.logical_or
df.loc[np.logical_and(df.A>=2, df.B<5)]
df[df.A>=2] #选择出行,其列A的值大于等于2
df.columns #显示列名
df.columns = [...] #修改列名
#打乱数据行
df.sample(frac=1) #.sample(frac)是采样,其中参数frac是返回的比例,1即100%表示全部返回。
# sampling with pseudo-random
df.sample(, random_state=seed_or_rng)
#I/O
#多个CSV合并为一个
result = pd.concat([pd.read_csv(f) for f in filenames], ignore_index=True)
# add/update row
df = pd.DataFrame()
df.set_index('id', inplace=True)
df.loc[id1]=pd.Series({'col1': 'v1', 'col2': 'v2'})
# each value is in
df['label'].isin({'A1','A2'}) # can NOT be: df['label'] in {'A1','A2'}, which will raise ambiguous error
~df['label'].isin({'A1','A2'})
print(df)
'''
<index> col_A col_B col_C
1 A1 B1 C1
'''
df.reindex(columns=['col_B', 'col_A'])
print(df)
"""
<index> col_B col_A
1 B1 A1
"""
df.drop_duplicates(subset=['A']) # drop duplicates by column 'A'
FAQ
pd.read_csv(...)
报错:
pandas oserror: initializing from file failed
一般发生于在Windows操作系统,读取名字含非ASCII字符的文件时。
解决:修改文件名为全ASCII字符;或pd.read_csv(engine='python')
;或安装对应版本的python和pandas。