Series
Series是一个一维的向量,每个值都会有对应标签,该标签我们称之为Index
Obj = Series([4, 5, -7, 8])
Obj
Out[5]:
0 4
1 5
2 -7
3 8
dtype: int64
Obj2 = Series([4, 5, -7, 8], index = ['a', 'b', 'c', 'd'])
Obj2
Out[7]:
a 4
b 5
c -7
d 8
dtype: int64
通过Index可以对Series进行查询以及修改
Obj2['a']
Out[12]: 4
Obj2['a'] = 0
Obj2
Out[14]:
a 0
b 5
c -7
d 8
dtype: int64
Numpy函数,以及其他类Numpy的向量计算函数,可以应用在Series中,与Numpy的ndarrays基本相同
Obj * 2
Out[16]:
0 8
1 10
2 -14
3 16
dtype: int64
python的dict数据可以直接转换为Series
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
obj3 = pd.Series(sdata)
obj3
Out[17]:
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
DataFrame
DataFrame是我作为数据分析师,最为常用的一个数据类型。DataFrame代表了一个长方形的表,包含了任意的长度及宽度(可以理解为在Excel中的一个表)。DataFrame拥有Column Index和Row Index(行标与列标)。
最常见的创建DataFrame的方法为从一个包含了Numpy arrays的dict数据转换
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
frame
Out[19]:
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
5 Nevada 2003 3.2
在创建通过表头的名字,我们可以更换列的顺序
frame = pd.DataFrame(data, columns = ['year', 'state', 'pop'])
frame
Out[21]:
year state pop
0 2000 Ohio 1.5
1 2001 Ohio 1.7
2 2002 Ohio 3.6
3 2001 Nevada 2.4
4 2002 Nevada 2.9
5 2003 Nevada 3.2
创建完成后,可以选择使用列名查询某列
frame['pop']
Out[22]:
0 1.5
1 1.7
2 3.6
3 2.4
4 2.9
5 3.2
loc方法可以查询某行
frame.loc[1]
Out[23]:
year 2001
state Ohio
pop 1.7
Name: 1, dtype: object
直接指定好列名以及对应的行,便可以很便利的向pandas添加数据,空的数据会在pandas中展示为NaN
frame['city'] = Series(['Kent', 'Las Vegas'], index = [0, 3])
frame
Out[25]:
year state pop city
0 2000 Ohio 1.5 Kent
1 2001 Ohio 1.7 NaN
2 2002 Ohio 3.6 NaN
3 2001 Nevada 2.4 Las Vegas
4 2002 Nevada 2.9 NaN
5 2003 Nevada 3.2 NaN
使用loc和iloc可以对一个dataframe执行分页操作
loc为选取该名字的行与列,iloc为选取第x行和第y列
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data, index = ['one', 'two', 'three', 'four', 'five', 'six'])
frame
Out[34]:
state year pop
one Ohio 2000 1.5
two Ohio 2001 1.7
three Ohio 2002 3.6
four Nevada 2001 2.4
five Nevada 2002 2.9
six Nevada 2003 3.2
frame.loc[['two', 'three'], ['state', 'year']]
Out[37]:
state year
two Ohio 2001
three Ohio 2002
frame.iloc[[2, 3], [0, 1]]
Out[38]:
state year
three Ohio 2002
four Nevada 2001
DataFrame 计算与缺失值
DataFrame基础计算方法包括了加、减、乘、除、次方、整除等
在计算方法中,fill_value值可以控制缺失值的替换
df1 = DataFrame(np.arange(12.).reshape(3, 4), columns = list('abcd'))
df2 = DataFrame(np.arange(15.).reshape(3, 5), columns = list('abecd'))
df1
Out[59]:
a b c d
0 0.0 1.0 2.0 3.0
1 4.0 5.0 6.0 7.0
2 8.0 9.0 10.0 11.0
df2
Out[60]:
a b e c d
0 0.0 1.0 2.0 3.0 4.0
1 5.0 6.0 7.0 8.0 9.0
2 10.0 11.0 12.0 13.0 14.0
df1 + df2
Out[61]:
a b c d e
0 0.0 2.0 5.0 7.0 NaN
1 9.0 11.0 14.0 16.0 NaN
2 18.0 20.0 23.0 25.0 NaN
df1.add(df2, fill_value = 0)
Out[62]:
a b c d e
0 0.0 2.0 5.0 7.0 2.0
1 9.0 11.0 14.0 16.0 7.0
2 18.0 20.0 23.0 25.0 12.0
除此之外reindex可以调整一个dataframe的shape,例如df1可以添加一行与df2保持一致
df1.reindex(columns = df2.columns, fill_value = 0)
Out[63]:
a b e c d
0 0.0 1.0 0 2.0 3.0
1 4.0 5.0 0 6.0 7.0
2 8.0 9.0 0 10.0 11.0
函数应用以及mapping
NumPy的ufuncs(向量化函数)是可以在DataFrame中应用的
例如我们定义一个函数,求该行的范围(最大值与最小值的绝对差)
frame
Out[152]:
b d e
Utah 0.0 1.0 2.0
Ohio 3.0 4.0 5.0
Texas 6.0 7.0 8.0
Oregon 9.0 10.0 11.0
get_range = lambda x: x.max() - x.min()
frame.apply(get_range)
Out[154]:
b 9.0
d 9.0
e 9.0
dtype: float64
frame.apply(get_range, axis = 'columns')
Out[158]:
Utah 2.0
Ohio 2.0
Texas 2.0
Oregon 2.0
dtype: float64
创建描述性统计函数
data = pd.DataFrame(np.random.randn(1000, 4))
data
Out[296]:
a b c d
0 0.660991 1.166362 -0.282237 -0.061292
1 -0.815670 0.220678 -0.072469 -0.343580
2 -1.431911 0.824215 -0.915729 -0.659971
3 0.696466 -0.556472 0.129206 0.739566
4 -1.475857 -0.043149 -1.839006 0.099850
.. ... ... ... ...
995 0.135430 0.923296 -0.819932 -0.876656
996 1.767997 1.747973 -0.609283 -0.608092
997 -0.239235 0.376930 0.154019 0.660505
998 0.202736 -0.214131 0.926638 -0.810888
999 -0.144855 -0.463251 0.984850 1.368218
[1000 rows x 4 columns]
def statistical_describe(DataFrame_input) -> DataFrame:
return DataFrame_input.apply(lambda x: pd.Series([len(x), sum(x)/len(x),
(sum((x - sum(x)/len(x))**2)/len(x))**.5,
x.min(), x.quantile(.25), x.quantile(.5), x.quantile(.75), x.max()],
index = ['count', 'mean', 'std', 'min', '.25', '.50', '.75', 'max']))
statistical_describe(data)
Out[297]:
a b c d
count 1000.000000 1000.000000 1000.000000 1000.000000
mean 0.035889 0.031281 -0.005168 -0.063525
std 1.035586 0.978126 0.975315 0.994380
min -3.068035 -3.513137 -3.373269 -3.251473
.25 -0.643046 -0.594430 -0.664430 -0.749127
.50 0.006002 0.051688 -0.010682 -0.087670
.75 0.714898 0.715789 0.663933 0.605968
max 3.790818 3.867886 2.673977 3.488003