- 1. 读csv文件
- 2. 删除Nan
- 3. Apply遍历行或列
- 4. pandas 转换 numpy
- 5. 表格连接-- merge, concat, join
- 6. 行列选择、切片–ix, iloc, loc
- 7. sample
1.读csv文件
(1)参数
-
header:是用来指定前几行用作列名的
-
sep :指定分隔符,一般为’,’
-
names: 列表,用来指定列的名字
-
converters : 列转换函数的字典,作用到每一列上,可以用来改变每列的类型
-
skiprows :从0行开始跳过多少行
-
nrows :读取多少行
-
iterator : true则返回一个TextFileReader,可以配合ger_chunk()使用 X ‾ \underline{X} X
-
dtype : 每列的数据类型 例如 {‘a’: np.float64, ‘b’: np.int32} 选 择 恰 当 的 数 据 类 型 很 重 要 ! ‾ \underline{选择恰当的数据类型很重要!} 选择恰当的数据类型很重要!
-
usecols :参数可以指定列号!比如只读前两列 ,那就是 [0,1]
-
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