笔记5——pandas基本功能

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对象具有许多属性,可让您访问元数据

  1. shape:给出对象的轴尺寸,与ndarray一致

  2. 轴标签:

    • Series:index(仅轴)

    • DataFrame:index(行)和columns

  3. .array属性:要在Index或Series中获取实际数据

  4. 需要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表示时区感知日期时间,因此有两种可能有用的表示形式:
    1. numpy.ndarray带有Timestamp对象的object-dtype ,每个对象都有正确的tz

    2. 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]])

注意

  1. 当处理异构数据时,将选择结果ndarray的dtype来容纳所有涉及的数据。例如,如果包含字符串,则结果将是对象dtype。如果只有浮点数和整数,则结果数组将为float dtype。

  2. 建议您避免 .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.加速操作

  1. numexpr库和bottleneck库来加速某些类型的二进制数值和布尔运算
  2. numexpr使用智能分块,缓存和多核。
  3. 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

猜你喜欢

转载自blog.csdn.net/chairon/article/details/107596173
今日推荐