Python中的重要科学计算库Pandas

Pandas库用来实现对CSV的快速处理,其在numpy之上提供了index和column机制。

加载

可以使用下面的方式实现条件加载

1
2
3
chunks = pd.read_csv(xxx, sep=',', skiprows=0, chunksize = 200)
chunks = itertools.takewhile(lambda chunk: int(chunk['id'].iloc[-1]) < MAXN, chunks)
df = pd.concat(chunks)

输出

1
2
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
print pd

索引与选择

loc

对DataFrame用loc得到一个Sereis。对Series用loc得到一个scalar。

1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D'])
df.loc[:, ['B', 'A']] # 得到一个DataFrame
df.loc[0] # 得到一个Series
df.loc[0, ['B']] # 得到一个Series
s = df.loc[0] # 得到一个Series
s.loc['B'] # 得到一个numpy.float64
s['B'] # 得到一个numpy.float64

iloc

相比loc,iloc提供了通过从0开始的需要而不是label的索引方式。

getitem

__getitem__的作用和loc是类似的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> df[['B', 'A']]
B A
0 -0.053222 0.521021
1 0.076465 1.716412
2 0.030738 -1.318004
3 0.755586 -0.549790
4 -0.923555 -0.265988
5 0.279349 -0.567961
6 -0.074739 -1.279447
7 0.367799 0.776724
>>> df[:, ['B', 'A']]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 2139, in __getitem__
return self._getitem_column(key)
File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 2146, in _getitem_column
return self._get_item_cache(key)
File "/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py", line 1840, in _get_item_cache
res = cache.get(item)
TypeError: unhashable type
>>> df[0:1]
A B C D
0 0.521021 -0.053222 0.328418 0.387408
>>>

ix

得到一个Series

1
df.ix[0]

使用Callable选择

1
2
3
df1.loc[lambda df: df.A > 0, :]
df1.loc[:, lambda df: ['A', 'B']]
df1.iloc[:, lambda df: [0, 1]]

数组合并

append

在append时,需要先reset_index
注意,一般我们可以将形如(3, )的Series加到一个(100, 3)的尾部,但如果我们将形如(1, )的进行添加,则可能出现NaN的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
>>> df = pd.DataFrame(np.random.randn(8, 3))
>>> delta = delta.reset_index(drop=True)
>>> delta2 = pd.Series([1.0, 2.0, 3.0])
>>> df.append(delta2, ignore_index=True)
0 1 2
0 -1.049542 0.472611 -0.234599
1 0.351365 -0.111055 -1.330641
2 -1.103300 0.701614 1.008360
3 0.467357 0.543402 1.646689
4 0.706422 1.097696 0.300561
5 -1.095927 -0.162622 2.420581
6 -0.883844 1.107275 -0.971891
7 0.509712 1.357901 1.050087
8 1.000000 2.000000 3.000000
>>> df.append(delta, ignore_index=True)
0 1 2
0 -1.049542 0.472611 -0.234599
1 0.351365 -0.111055 -1.330641
2 -1.103300 0.701614 1.008360
3 0.467357 0.543402 1.646689
4 0.706422 1.097696 0.300561
5 -1.095927 -0.162622 2.420581
6 -0.883844 1.107275 -0.971891
7 0.509712 1.357901 1.050087
8 1.000000 NaN NaN

concat

Pandas和numpy交互

从DataFrame到ndarray可以用

1
2
df.values
df.to_numpy()

从numpy到DataFrame可以用

1
2
3
pd.DataFrame(data=data[1:,1:],    # values
index=data[1:,0], # 1st column as index
columns=data[0,1:]) # 1st row as the column names

Reference

  1. https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html