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=):
how-inner
how-left
how-right
how-outer
(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 转义符,用以转义quotecharsep,默认无。

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 接口文档

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。
  • inplaceTrue时表示在该实例内进行改变(此时方法无返回值);(默认)为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 DataFrame
  • index 索引
  • 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。

melt()

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。

posted @ 2022-07-06 23:30  二球悬铃木  阅读(135)  评论(0编辑  收藏  举报