import pandas as pd
import numpy as np
index=pd.date_range('1/1/2000',periods=8)
s=pd.Series(np.random.randn(5),index=['a','b','c','d','e'])
df=pd.DataFrame(np.random.randn(8,3),index=index,columns=['A',"B","C"])
1.头和尾:
- 要查看Series或DataFrame对象的小样本,请使用 head()和tail()方法。
- 默认显示的元素数是5
long_series=pd.Series(np.random.randn(1000))
long_series.head()
0 0.527670
1 2.537427
2 0.587584
3 -2.279087
4 0.615224
dtype: float64
long_series.tail()
995 0.677572
996 1.371687
997 0.999676
998 0.686117
999 -1.675617
dtype: float64
2.属性和底层数据
**pandas对象具有许多属性,可让您访问元数据
-
shape:给出对象的轴尺寸,与ndarray一致
-
轴标签:
-
Series:index(仅轴)
-
DataFrame:index(行)和columns
-
-
.array属性:要在Index或Series中获取实际数据
-
需要NumPy数组,请使用to_numpy() 或numpy.asarray()。
df[:2]
A | B | C | |
---|---|---|---|
2000-01-01 | 0.887962 | -0.430778 | -0.327544 |
2000-01-02 | -1.372383 | 0.426999 | 0.106382 |
df.columns=[x.lower()for x in df.columns]
df
a | b | c | |
---|---|---|---|
2000-01-01 | 0.887962 | -0.430778 | -0.327544 |
2000-01-02 | -1.372383 | 0.426999 | 0.106382 |
2000-01-03 | -0.622395 | 0.080339 | 0.984904 |
2000-01-04 | -0.833510 | 0.293786 | -0.873864 |
2000-01-05 | -0.552204 | -1.442398 | 1.634265 |
2000-01-06 | -0.129201 | 0.365440 | -0.315066 |
2000-01-07 | -1.416135 | 1.208005 | -1.889892 |
2000-01-08 | 0.096127 | 1.046189 | 0.261059 |
s.array
<PandasArray>
[-0.04661577764280703, 0.3615137086998822, -1.0953073788095598,
0.9866785542836566, -0.8796406826467855]
Length: 5, dtype: float64
s.index.array
<PandasArray>
['a', 'b', 'c', 'd', 'e']
Length: 5, dtype: object
s.to_numpy()
array([-0.04661578, 0.36151371, -1.09530738, 0.98667855, -0.87964068])
np.asarray(s)
array([-0.04661578, 0.36151371, -1.09530738, 0.98667855, -0.87964068])
to_numpy()
- 当Series或Index有时ExtensionArray,to_numpy() 可能涉及复制数据和强制值。
- to_numpy()给出了一些在控制dtype由此而来numpy.ndarray。例如,考虑带时区的日期时间。NumPy没有dtype表示时区感知日期时间,因此有两种可能有用的表示形式:
-
numpy.ndarray带有Timestamp对象的object-dtype ,每个对象都有正确的tz
-
A datetime64[ns]-dtype numpy.ndarray,其中值已转换为UTC且时区已丢弃时区可以保留为 dtype=object
-
- 当DataFrame所有列只有一个数据类型时,DataFrame.to_numpy()将返回基础数据
ser=pd.Series(pd.date_range('2000',periods=2,tz="CET"))
ser.to_numpy(dtype=object)
array([Timestamp('2000-01-01 00:00:00+0100', tz='CET', freq='D'),
Timestamp('2000-01-02 00:00:00+0100', tz='CET', freq='D')],
dtype=object)
ser.to_numpy(dtype="datetime64[ns]")
array(['1999-12-31T23:00:00.000000000', '2000-01-01T23:00:00.000000000'],
dtype='datetime64[ns]')
df.to_numpy()
array([[ 0.88796152, -0.43077808, -0.32754366],
[-1.3723835 , 0.42699905, 0.10638186],
[-0.62239471, 0.08033893, 0.98490359],
[-0.83350963, 0.29378627, -0.87386352],
[-0.55220384, -1.44239833, 1.63426481],
[-0.12920109, 0.36544038, -0.31506615],
[-1.41613487, 1.20800499, -1.88989196],
[ 0.09612697, 1.04618909, 0.26105902]])
注意
-
当处理异构数据时,将选择结果ndarray的dtype来容纳所有涉及的数据。例如,如果包含字符串,则结果将是对象dtype。如果只有浮点数和整数,则结果数组将为float dtype。
-
建议您避免 .values使用.array或.to_numpy()。.values具有以下缺点:
-
当Series包含扩展类型时,不清楚是Series.values返回NumPy数组还是扩展数组。 Series.array将始终返回ExtensionArray,并且永远不会复制数据。Series.to_numpy()将始终返回NumPy数组,可能会以复制/强制值为代价。
-
当您的DataFrame包含多种数据类型时,DataFrame.values可能涉及将数据复制和强制值转换为通用dtype,这是一个相对昂贵的操作。DataFrame.to_numpy()作为一种方法,可以使返回的NumPy数组可能不是DataFrame中相同数据的视图更加清楚。
-
3.加速操作
- numexpr库和bottleneck库来加速某些类型的二进制数值和布尔运算
- numexpr使用智能分块,缓存和多核。
- bottleneck是一组专用的cython例程,在处理具有nans的数组时特别快
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4nl4We4P-1595754349043)(attachment:image.png)]
4.灵活的二进制运算
-
通过pandas数据结构之间的二进制操作,有两个关键的关注点:
-
高维(例如DataFrame)和低维(例如Series)对象之间的广播行为。
-
计算中缺少数据。
-
1.匹配/广播行为
- 数据框所拥有的方法add(),sub(), mul(),div()和相关的功能 radd(),rsub()…用于执行二进制运算。
- 对于广播行为,系列输入是最重要的。使用这些功能,您可以通过axis关键字用于匹配索引或列
df=pd.DataFrame({
'one':pd.Series(np.random.randn(3),index=['a','b','c']),
'two':pd.Series(np.random.randn(4),index=['a','b','c','d']),
'three':pd.Series(np.random.randn(3),index=['b','c','d'])
})
df
one | two | three | |
---|---|---|---|
a | -0.625218 | 1.152137 | NaN |
b | 0.578056 | -0.472420 | 0.008799 |
c | -0.209515 | -1.496828 | -0.008840 |
d | NaN | -0.421547 | -0.117937 |
row=df.iloc[1]#第二行
row
one 0.578056
two -0.472420
three 0.008799
Name: b, dtype: float64
column=df["two"]#第二列
column
a 1.152137
b -0.472420
c -1.496828
d -0.421547
Name: two, dtype: float64
df.sub(row,axis='columns')#子表
one | two | three | |
---|---|---|---|
a | -1.203274 | 1.624557 | NaN |
b | 0.000000 | 0.000000 | 0.000000 |
c | -0.787572 | -1.024408 | -0.017639 |
d | NaN | 0.050872 | -0.126736 |
df.sub(row,axis=1)
one | two | three | |
---|---|---|---|
a | -1.203274 | 1.624557 | NaN |
b | 0.000000 | 0.000000 | 0.000000 |
c | -0.787572 | -1.024408 | -0.017639 |
d | NaN | 0.050872 | -0.126736 |
df.sub(column,axis='index')
one | two | three | |
---|---|---|---|
a | -1.777355 | 0.0 | NaN |
b | 1.050476 | 0.0 | 0.481219 |
c | 1.287313 | 0.0 | 1.487988 |
d | NaN | 0.0 | 0.303610 |
df.sub(column,axis=0)
one | two | three | |
---|---|---|---|
a | -1.777355 | 0.0 | NaN |
b | 1.050476 | 0.0 | 0.481219 |
c | 1.287313 | 0.0 | 1.487988 |
d | NaN | 0.0 | 0.303610 |
#可以将MultiIndexed DataFrame的级别与Series对齐。
dfmi=df.copy()
dfmi.index=pd.MultiIndex.from_tuples([(1,'a'),(1,'b'),
(1,'c'),(2,'a')],
names=['first','second'])
dfmi.sub(column,axis=0,level='second')
one | two | three | ||
---|---|---|---|---|
first | second | |||
1 | a | -1.777355 | 0.000000 | NaN |
b | 1.050476 | 0.000000 | 0.481219 | |
c | 1.287313 | 0.000000 | 1.487988 | |
2 | a | NaN | -1.573685 | -1.270075 |
#Series和index也支持divmod()内置。
#此函数同时进行地板除法和模运算,并返回与左侧相同类型的二元组。例如:
s=pd.Series(np.arange(10))
s
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
dtype: int32
div,rem=divmod(s,3)
div
0 0
1 0
2 0
3 1
4 1
5 1
6 2
7 2
8 2
9 3
dtype: int32
rem
0 0
1 1
2 2
3 0
4 1
5 2
6 0
7 1
8 2
9 0
dtype: int32
#我们还可以按元素进行操作divmod():
div, rem = divmod(s, [2, 2, 3, 3, 4, 4, 5, 5, 6, 6])
div
0 0
1 0
2 0
3 1
4 1
5 1
6 1
7 1
8 1
9 1
dtype: int32
rem
0 0
1 1
2 2
3 0
4 0
5 1
6 1
7 2
8 2
9 3
dtype: int32