pandas API总结

本文详细介绍了Pandas API的使用,包括读取csv文件的参数解析、删除Nan值的方法、Apply函数的遍历操作、数据转换到numpy、表格连接merge、concat和join的用法,以及行列选择和切片的各种方式。此外,还提到了弃用的ix方法和sample函数的随机抽样功能。
摘要由CSDN通过智能技术生成

常见的可能用到的一些函数的官方文档

1.读csv文件

(1)参数

  1. header:是用来指定前几行用作列名的

  2. sep :指定分隔符,一般为’,’

  3. names: 列表,用来指定列的名字

  4. converters : 列转换函数的字典,作用到每一列上,可以用来改变每列的类型

  5. skiprows :从0行开始跳过多少行

  6. nrows :读取多少行

  7. iterator : true则返回一个TextFileReader,可以配合ger_chunk()使用 X ‾ \underline{X} X

  8. dtype : 每列的数据类型 例如 {‘a’: np.float64, ‘b’: np.int32} 选 择 恰 当 的 数 据 类 型 很 重 要 ! ‾ \underline{选择恰当的数据类型很重要!}

  9. usecols :参数可以指定列号!比如只读前两列 ,那就是 [0,1]

  10. encoding : str ,指定字符集类型,通常指定为’utf-8’. 中文可以使用’gb2312’. List of Python standard encodings

1.1一些用法

  • 读取一个很大的文件,可以设iterator=True然后使用while + try+ get_chunk() + expect StopIteration
df = pd.read_csv('./data/test_20190518.csv', sep=',', header=None,iterator=True)
   while 1:
       try:
           all_train_info_chunk = df.get_chunk(1000000)
       except StopIteration:
           break

比如要读100000行数据,但是只有50行,那么只会读50行,下次再读就会返回StopIteration

2.删除Nan

df.dropna( axis=0, how='any', thresh=None, subset=None, inplace=False)
  • axis: 0, or ‘index’ : Drop rows which contain missing values. 1, or ‘columns’ : Drop columns which contain missing value.
  • how: =any 就是有一个缺失值都会drop掉该行或该列,=all 就是要全部都为Nan才会drop
  • inplace: =True就是在df上直接操作,否则不是

3. Apply遍历行或列

df.apply( func, axis=0, broadcast=None, raw=False, reduce=None, result_type=None, args=(), **kwds)         
  • func是你定义的或系统一个函数
  • axis , =0代表把func应用到列,一列一列的应用过去. =1 代表应用到每行,一行一行的遍历
  • result_type :{‘expand’, ‘reduce’, ‘broadcast’, None}, default None。只有当axis=1时有效。

用法

  • 可以用来遍历每一行,并且修改每一行的值
    left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                         'A': ['A0', 'A1', 'A2', 'A3'],
                         'B': ['B0', 'B1', 'B2', 'B3'] })
                       
    def firstClass_to_ID(row):
        print(row[1])
        print(row['A'])
    print(left)
    left.apply(firstClass_to_ID,axis=1)

运行结果

注意参数 result_type ,有几种用法

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                         'A': ['A0', 'A1', 'A2', 'A3'],
                         'B': ['B0', 'B1', 'B2', 'B3'],
                         'C': ['B0', 'B1', 'B2', 'B3'],
                         'D': ['B0', 'B1', 'B2', 'B3']})
    
    
    def test_expand(row ):
        return [row[0]]*3
print(left)
print('expand')
left[['key', 'B', 'C']] = left.apply(test_expand, axis=1,result_type='expand')
print(left)

上面代码的结果如下,expand的作用是:把原始数据中的每一行数据应用test_expand函数后返回的一行数据替换掉你指定的那几列
在这里插入图片描述
apply也可以配合groupby使用这里有个比较精彩的使用案例


4. pandas 转换 numpy

有三种方法

df=pd.DataFrame({'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]})
np_array=df.values()
np_array=df.as_matrix() # 这个以后的版本会取消
np_array=np.array(df)
# 官方推荐方法
np_array=df.to_numpy()

用这些方法其实并不会生成一个新的np数组,用sys.getsizeof(np_array) 就会发现所占用的字节很小. 所以是共享df的内存


5.表格连接-- merge, concat, join

(1)merge—数据表的连接,类似数据库的表连接

DataFrame.merge(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)

具体每个参数详见官网
how:指的是合并(连接)的方式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);
on: 可以传入一个list,表示用哪些列进行连接
left_on:左则DataFrame中用作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时非常有用。
right_on:右则DataFrame中用作 连接键的列名
validate:str, 检查keys是否为one_to_one或者其他类型如one-to-many

>>> df1 = pd.DataFrame({'lkey': ['foo', 'bar', 'baz', 'foo'],
...                     'value': [1, 2, 3, 5]})
>>> df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz', 'foo'],
...                     'value': [5, 6, 7, 8]})
>>> df1
    lkey value
0   foo      1
1   bar      2
2   baz      3
3   foo      5
>>> df2
    rkey value
0   foo      5
1   bar      6
2   baz      7
3   foo      8

>>> df1.merge(df2, left_on='lkey', right_on='rkey',
...           suffixes=('_left', '_right'))
  lkey  value_left rkey  value_right
0  foo           1  foo            5
1  foo           1  foo            8
2  foo           5  foo            5
3  foo           5  foo            8
4  bar           2  bar            6
5  baz           3  baz            7

(2)concat

这篇博客讲的很明白了

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
       keys=None, levels=None, names=None, verify_integrity=False)

ignore_index : True就是合并之后的数据的顺序重新排序,false的话每一行数据还是会保持为它在原来的数据表中的行号

(3) join

DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)

主要是用来做列的拼接
参数的意义和上面的都一样

>>> df = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3', 'K4', 'K5'],
...                    'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']})
>>> df
  key   A
0  K0  A0
1  K1  A1
2  K2  A2
3  K3  A3
4  K4  A4
5  K5  A5

>>> other = pd.DataFrame({'key': ['K0', 'K1', 'K2'],
...                       'B': ['B0', 'B1', 'B2']})
>>> other
  key   B
0  K0  B0
1  K1  B1
2  K2  B2

>>> >>> dfdf..joinjoin((otherother,,  lsuffixlsuffix=='_caller''_caller',,  rsuffixrsuffix=='_other''_other'))
   key_caller   A key_other    B  key_caller   A key_other    B
 0         K0  A0        K0   B00         K0  A0        K0   B0
 1         K1  A1        K1   B11         K1  A1        K1   B1
 2         K2  A2        K2   B22         K2  A2        K2   B2
 3         K3  A3       NaN  NaN3         K3  A3       NaN  NaN
 4         K4  A4       NaN  NaN4         K4  A4       NaN  NaN
 5         K5  A5       NaN  NaN5         K5  A5       NaN  NaN

>>> df.set_index('key').join(other.set_index('key'))
      A    B
key
K0   A0   B0
K1   A1   B1
K2   A2   B2
K3   A3  NaN
K4   A4  NaN
K5   A5  NaN

上面的set_index(‘key’)函数 是指明让某一列成为这个表的index

6. 行列选择、切片–ix, iloc, loc

官方文档

(6.1) .loc[ ]

主要用途:根据 行 标 签 ‾ \underline{行标签} 来选择数据。

  • 发生错误时返回 KeyError , when the items are not found.
  • 5或者’a’ 5也是行label
  • A list or array of labels [‘a’, ‘b’, ‘c’].
  • 也可以使用一个callable function来选择数据
df1.loc[lambda df: df.A > 0, :]  # 选择A列大于0的全部行(一行包含全部列)
df1.A.loc[lambda s: s > 0]      # 选择A列大于0的全部行 (一行只包含A列数据,因为是df1.A.)
df1.loc[df1.index[[0, 2]], 'A']  # 选择第0和2 行的A列数据

(6.2) .iloc[ ]

主要用途:根据 行 号 ‾ \underline{行号} 来选择数据。(即根据每行的position)

  • 发生错误时返回 IndexError , if a requested indexer is out-of-bounds
  • 也可以使用一个callable function来选择数据
  • 为某一行赋值,但是不允许为不存在的列赋值
In [28]: x = pd.DataFrame({'x': [1, 2, 3], 'y': [3, 4, 5]})
In [29]: x.iloc[1] = {'x': 9, 'y': 99}
In [30]: x
Out[30]: 
   x   y
0  1   3
1  9  99
2  3   5
# 这行代码会出错,因为X中根本没有.two
x.two = [4, 5, 6]

(6.3)直接用df[m:n][‘columns_label’]来索引数据

选择m到n行数据的某列,包不包括第n行这里有个疑问,网上都是包括n行,但是我运行的结果并不包括,可能是版本的问题
如果是某几列,那就是df[m:n][[‘columns_label1’,‘columns_label2’,‘columns_label3’]]

(6.4) ix

这个官方已经不推荐使用了,原因是用起来比较magic所以容易引起confusions

7. sample

官方文档

DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)

用来打乱数据,需要注意 参数:weights的用法,其他参数都很简单

  • weights: str or ndarray-like. 可以指定某一列作为权重来影响采样结果 .可以为0但是不能无限大,缺失默认为0(0就不会被采样到)
>>> df = pd.DataFrame({'num_legs': [2, 4, 8, 0],
...                    'num_wings': [2, 0, 0, 0],
...                    'num_specimen_seen': [10, 2, 1, 8]},
...                   index=['falcon', 'dog', 'spider', 'fish'])
>>> df
        num_legs  num_wings  num_specimen_seen
falcon         2          2                 10
dog            4          0                  2
spider         8          0                  1
fish           0          0                  8
>>> df.sample(n=2, weights='num_specimen_seen', random_state=1)
        num_legs  num_wings  num_specimen_seen
falcon         2          2                 10
fish           0          0                  8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值