资讯专栏INFORMATION COLUMN

Python 数据分析之 pandas 进阶(一)

red_bricks / 3712人阅读

摘要:所处理的数组是方法可以对指定轴上的索引进行改变增加删除操作,这将返回原始数据的一个拷贝去掉包含缺失值的行对缺失值进行填充对数据进行布尔填充五合并提供了大量的方法能够轻松的对和对象进行各种符合各种逻辑关系的合并操作。

导入本篇中使用到的模块:

</>复制代码

  1. import numpy as np
  2. import pandas as pd
  3. from pandas import Series, DataFrame

我们可以调整数据输出框大小以便观察:

</>复制代码

  1. pd.set_option("display.width", 200)

一、创建对象
1、可以通过传递一个list对象来创建一个Series,pandas会默认创建整型索引:

</>复制代码

  1. s = pd.Series([1,3,5,np.nan,6,8])
  2. s
  3. 0 1
  4. 1 3
  5. 2 5
  6. 3 NaN
  7. 4 6
  8. 5 8
  9. dtype: float64

2、通过传递一个numpy array,时间索引以及列标签来创建一个DataFrame:

</>复制代码

  1. dates = pd.date_range("20130101", periods=6)
  2. df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list("ABCD"))
  3. dates
  4. df
  5. DatetimeIndex(["2013-01-01", "2013-01-02", "2013-01-03", "2013-01-04",
  6. "2013-01-05", "2013-01-06"],
  7. dtype="datetime64[ns]", freq="D")
  8. A B C D
  9. 2013-01-01 -1.857957 -0.297110 0.135704 0.199878
  10. 2013-01-02 0.139027 1.683491 -1.031190 1.447487
  11. 2013-01-03 -0.596279 -1.211098 1.169525 0.663366
  12. 2013-01-04 0.367213 -0.020313 2.169802 -1.295228
  13. 2013-01-05 0.224122 1.003625 -0.488250 -0.594528
  14. 2013-01-06 0.186073 -0.537019 -0.252442 0.530238

3、通过传递一个能够被转换成类似序列结构的字典对象来创建一个DataFrame:

</>复制代码

  1. df2 = pd.DataFrame({"A":1.,
  2. "B":pd.Timestamp("20130102"),
  3. "C":pd.Series(1, index=list(range(4)),dtype="float32"),
  4. "D":np.array([3] * 4, dtype="int32"),
  5. "E":pd.Categorical(["test","train", "test","train"]),
  6. "F":"foo"
  7. })
  8. df2

4、查看不同列的数据类型:

</>复制代码

  1. df2.dtypes
  2. A float64
  3. B datetime64[ns]
  4. C float32
  5. D int32
  6. E category
  7. F object
  8. dtype: object

5、使用Tab自动补全功能会自动识别所有的属性以及自定义的列

二、查看数据
1.查看Frame中头部和尾部的行:

</>复制代码

  1. df.head()
  2. A B C D
  3. 2013-01-01 -1.857957 -0.297110 0.135704 0.199878
  4. 2013-01-02 0.139027 1.683491 -1.031190 1.447487
  5. 2013-01-03 -0.596279 -1.211098 1.169525 0.663366
  6. 2013-01-04 0.367213 -0.020313 2.169802 -1.295228
  7. 2013-01-05 0.224122 1.003625 -0.488250 -0.594528

</>复制代码

  1. df.tail(3)
  2. A B C D
  3. 2013-01-04 0.367213 -0.020313 2.169802 -1.295228
  4. 2013-01-05 0.224122 1.003625 -0.488250 -0.594528
  5. 2013-01-06 0.186073 -0.537019 -0.252442 0.530238

2、显示索引、列和底层的numpy数据:

</>复制代码

  1. df.index
  2. DatetimeIndex(["2013-01-01", "2013-01-02", "2013-01-03", "2013-01-04",
  3. "2013-01-05", "2013-01-06"],
  4. dtype="datetime64[ns]", freq="D")

</>复制代码

  1. df.columns
  2. Index(["A", "B", "C", "D"], dtype="object")

3、describe()函数对于数据的快速统计汇总:

</>复制代码

  1. df.describe()
  2. A B C D
  3. count 6.000000 6.000000 6.000000 6.000000
  4. mean -0.256300 0.103596 0.283858 0.158536
  5. std 0.854686 1.060269 1.181208 0.973309
  6. min -1.857957 -1.211098 -1.031190 -1.295228
  7. 25% -0.412452 -0.477042 -0.429298 -0.395927
  8. 50% 0.162550 -0.158711 -0.058369 0.365058
  9. 75% 0.214610 0.747641 0.911070 0.630084
  10. max 0.367213 1.683491 2.169802 1.447487

4、对数据的转置(tranverse):

</>复制代码

  1. df.T
  2. 2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06
  3. 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00
  4. A -1.857957 0.139027 -0.596279 0.367213 0.224122 0.186073
  5. B -0.297110 1.683491 -1.211098 -0.020313 1.003625 -0.537019
  6. C 0.135704 -1.031190 1.169525 2.169802 -0.488250 -0.252442
  7. D 0.199878 1.447487 0.663366 -1.295228 -0.594528 0.530238

5、按轴进行排序:

</>复制代码

  1. df.sort_index(axis=1,ascending=False)
  2. D C B A
  3. 2013-01-01 0.199878 0.135704 -0.297110 -1.857957
  4. 2013-01-02 1.447487 -1.031190 1.683491 0.139027
  5. 2013-01-03 0.663366 1.169525 -1.211098 -0.596279
  6. 2013-01-04 -1.295228 2.169802 -0.020313 0.367213
  7. 2013-01-05 -0.594528 -0.488250 1.003625 0.224122
  8. 2013-01-06 0.530238 -0.252442 -0.537019 0.186073

6、按值进行排序:

</>复制代码

  1. df.sort(columns="B")
  2. A B C D
  3. 2013-01-03 -0.596279 -1.211098 1.169525 0.663366
  4. 2013-01-06 0.186073 -0.537019 -0.252442 0.530238
  5. 2013-01-01 -1.857957 -0.297110 0.135704 0.199878
  6. 2013-01-04 0.367213 -0.020313 2.169802 -1.295228
  7. 2013-01-05 0.224122 1.003625 -0.488250 -0.594528
  8. 2013-01-02 0.139027 1.683491 -1.031190 1.447487

三、选择数据
以下是将要操作的数组:

</>复制代码

  1. df
  2. A B C D
  3. 2013-01-01 -1.857957 -0.297110 0.135704 0.199878
  4. 2013-01-02 0.139027 1.683491 -1.031190 1.447487
  5. 2013-01-03 -0.596279 -1.211098 1.169525 0.663366
  6. 2013-01-04 0.367213 -0.020313 2.169802 -1.295228
  7. 2013-01-05 0.224122 1.003625 -0.488250 -0.594528
  8. 2013-01-06 0.186073 -0.537019 -0.252442 0.530238

1、获取数据

(1)、选择一个多带带的列,这将会返回一个Series:

</>复制代码

  1. df["A"]
  2. 2013-01-01 -1.857957
  3. 2013-01-02 0.139027
  4. 2013-01-03 -0.596279
  5. 2013-01-04 0.367213
  6. 2013-01-05 0.224122
  7. 2013-01-06 0.186073
  8. Freq: D, Name: A, dtype: float64

(2)、通过[]进行选择,即:切片

</>复制代码

  1. df[0:3]
  2. A B C D
  3. 2013-01-01 -1.857957 -0.297110 0.135704 0.199878
  4. 2013-01-02 0.139027 1.683491 -1.031190 1.447487
  5. 2013-01-03 -0.596279 -1.211098 1.169525 0.663366

2、标签选择

(1)、使用标签来获取一个交叉的区域

</>复制代码

  1. df.loc[dates[0]]
  2. A -1.857957
  3. B -0.297110
  4. C 0.135704
  5. D 0.199878
  6. Name: 2013-01-01 00:00:00, dtype: float64

(2)、通过标签来在多个轴上进行选择

</>复制代码

  1. df.loc[:,["A", "B"]]
  2. A B
  3. 2013-01-01 -1.857957 -0.297110
  4. 2013-01-02 0.139027 1.683491
  5. 2013-01-03 -0.596279 -1.211098
  6. 2013-01-04 0.367213 -0.020313
  7. 2013-01-05 0.224122 1.003625
  8. 2013-01-06 0.186073 -0.537019

(3)、标签切片

</>复制代码

  1. df.loc["20130102":"20130104", ["A","B"]]
  2. A B
  3. 2013-01-02 0.139027 1.683491
  4. 2013-01-03 -0.596279 -1.211098
  5. 2013-01-04 0.367213 -0.020313

(4)、对于返回的对象进行维度缩减

</>复制代码

  1. df.loc["20130102", ["A","B"]]
  2. A 0.139027
  3. B 1.683491
  4. Name: 2013-01-02 00:00:00, dtype: float64

(5)、获取一个标量

</>复制代码

  1. df.loc[dates[0], "A"]
  2. -1.8579571971312099

3、位置选择

(1)、通过传递数值进行位置选择(选择的是行)

</>复制代码

  1. df.iloc[3]
  2. A 0.367213
  3. B -0.020313
  4. C 2.169802
  5. D -1.295228
  6. Name: 2013-01-04 00:00:00, dtype: float64

(2)、通过数值进行切片

</>复制代码

  1. df.iloc[3:5,0:2]
  2. A B
  3. 2013-01-04 0.367213 -0.020313
  4. 2013-01-05 0.224122 1.003625

(3)、通过指定一个位置的列表

</>复制代码

  1. df.iloc[[1,2,4],[0,2]]
  2. A C
  3. 2013-01-02 0.139027 -1.031190
  4. 2013-01-03 -0.596279 1.169525
  5. 2013-01-05 0.224122 -0.488250

(4)、对行进行切片

</>复制代码

  1. df.iloc[1:3,:]
  2. A B C D
  3. 2013-01-02 0.139027 1.683491 -1.031190 1.447487
  4. 2013-01-03 -0.596279 -1.211098 1.169525 0.663366

(5)、获取特定的值

</>复制代码

  1. df.iloc[1,1]
  2. 1.6834910794696132

4、布尔索引

(1)、使用一个多带带列的值来选择数据:

</>复制代码

  1. df[df.A > 0]
  2. A B C D
  3. 2013-01-02 0.139027 1.683491 -1.031190 1.447487
  4. 2013-01-04 0.367213 -0.020313 2.169802 -1.295228
  5. 2013-01-05 0.224122 1.003625 -0.488250 -0.594528
  6. 2013-01-06 0.186073 -0.537019 -0.252442 0.530238

(2)、使用where操作来选择数据:

</>复制代码

  1. df[df > 0]
  2. A B C D
  3. 2013-01-01 NaN NaN 0.135704 0.199878
  4. 2013-01-02 0.139027 1.683491 NaN 1.447487
  5. 2013-01-03 NaN NaN 1.169525 0.663366
  6. 2013-01-04 0.367213 NaN 2.169802 NaN
  7. 2013-01-05 0.224122 1.003625 NaN NaN
  8. 2013-01-06 0.186073 NaN NaN 0.530238

(3)、使用isin()方法来过滤:

</>复制代码

  1. df2 = df.copy()
  2. df2["E"] = ["one", "one", "two", "three", "four", "three"]
  3. df2
  4. A B C D E
  5. 2013-01-01 -1.857957 -0.297110 0.135704 0.199878 one
  6. 2013-01-02 0.139027 1.683491 -1.031190 1.447487 one
  7. 2013-01-03 -0.596279 -1.211098 1.169525 0.663366 two
  8. 2013-01-04 0.367213 -0.020313 2.169802 -1.295228 three
  9. 2013-01-05 0.224122 1.003625 -0.488250 -0.594528 four
  10. 2013-01-06 0.186073 -0.537019 -0.252442 0.530238 three

</>复制代码

  1. df2[df2["E"].isin(["two", "four"])]
  2. A B C D E
  3. 2013-01-03 -0.596279 -1.211098 1.169525 0.663366 two
  4. 2013-01-05 0.224122 1.003625 -0.488250 -0.594528 four

5、设置

(1)、设置一个新的列:

</>复制代码

  1. s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range("20130102", periods=6))
  2. s1
  3. 2013-01-02 1
  4. 2013-01-03 2
  5. 2013-01-04 3
  6. 2013-01-05 4
  7. 2013-01-06 5
  8. 2013-01-07 6
  9. Freq: D, dtype: int64

</>复制代码

  1. df["F"] = s1
  2. df
  3. A B C D F
  4. 2013-01-01 0.000000 0.000000 0.135704 5 NaN
  5. 2013-01-02 0.139027 1.683491 -1.031190 5 1
  6. 2013-01-03 -0.596279 -1.211098 1.169525 5 2
  7. 2013-01-04 0.367213 -0.020313 2.169802 5 3
  8. 2013-01-05 0.224122 1.003625 -0.488250 5 4
  9. 2013-01-06 0.186073 -0.537019 -0.252442 5 5

(2)、设置新值

</>复制代码

  1. df.at[dates[0],"A"] = 0 #通过标签设置新值
  2. df.iat[0,1] = 0 #通过位置设置新值
  3. df.loc[:, "D"] = np.array([5] * len(df)) #通过一个numpy数值设置一组新值
  4. df
  5. A B C D F
  6. 2013-01-01 0.000000 0.000000 0.135704 5 NaN
  7. 2013-01-02 0.139027 1.683491 -1.031190 5 1
  8. 2013-01-03 -0.596279 -1.211098 1.169525 5 2
  9. 2013-01-04 0.367213 -0.020313 2.169802 5 3
  10. 2013-01-05 0.224122 1.003625 -0.488250 5 4
  11. 2013-01-06 0.186073 -0.537019 -0.252442 5 5

四、缺失值处理

在pandas中,使用np.nan来代替缺失值,这些值将默认不会包含在计算中。所处理的数组是:

</>复制代码

  1. df
  2. A B C D F
  3. 2013-01-01 0.000000 0.000000 0.135704 5 NaN
  4. 2013-01-02 0.139027 1.683491 -1.031190 5 1
  5. 2013-01-03 -0.596279 -1.211098 1.169525 5 2
  6. 2013-01-04 0.367213 -0.020313 2.169802 5 3
  7. 2013-01-05 0.224122 1.003625 -0.488250 5 4
  8. 2013-01-06 0.186073 -0.537019 -0.252442 5 5

1、reindex()方法可以对指定轴上的索引进行改变/增加/删除操作,这将返回原始数据的一个拷贝:

</>复制代码

  1. df1 = df.reindex(index=dates[0:4],columns=list(df.columns) + ["E"])
  2. df1.loc[dates[0]:dates[1], "E"] = 1
  3. df1
  4. A B C D F E
  5. 2013-01-01 0.000000 0.000000 0.135704 5 NaN 1
  6. 2013-01-02 0.139027 1.683491 -1.031190 5 1 1
  7. 2013-01-03 -0.596279 -1.211098 1.169525 5 2 NaN
  8. 2013-01-04 0.367213 -0.020313 2.169802 5 3 NaN

2、去掉包含缺失值的行:

</>复制代码

  1. df1.dropna(how="any")
  2. A B C D F E
  3. 2013-01-02 0.139027 1.683491 -1.03119 5 1 1

3、对缺失值进行填充:

</>复制代码

  1. df1.fillna(value=5)
  2. A B C D F E
  3. 2013-01-01 0.000000 0.000000 0.135704 5 5 1
  4. 2013-01-02 0.139027 1.683491 -1.031190 5 1 1
  5. 2013-01-03 -0.596279 -1.211098 1.169525 5 2 5
  6. 2013-01-04 0.367213 -0.020313 2.169802 5 3 5

4、对数据进行布尔填充:

</>复制代码

  1. pd.isnull(df1)
  2. A B C D F E
  3. 2013-01-01 False False False False True False
  4. 2013-01-02 False False False False False False
  5. 2013-01-03 False False False False False True
  6. 2013-01-04 False False False False False True

五、合并

pandas提供了大量的方法能够轻松的对Series、DataFrame和Panel对象进行各种符合各种逻辑关系的合并操作。

1、Concat

</>复制代码

  1. df = pd.DataFrame(np.random.randn(10, 4))
  2. df
  3. 0 1 2 3
  4. 0 0.680581 1.918851 0.521201 -0.389951
  5. 1 0.724157 2.282989 0.648427 -0.827308
  6. 2 2.437781 0.232518 1.066197 -0.233117
  7. 3 0.038747 3.174875 -1.384120 0.322864
  8. 4 -0.835962 1.015841 0.042094 -1.903701
  9. 5 0.095194 1.926612 0.512825 0.786349
  10. 6 -1.098231 -0.669381 -0.623124 -0.411114
  11. 7 -1.229527 -0.738026 0.453683 -2.037488
  12. 8 -0.499546 -0.816864 -0.395079 -0.320400
  13. 9 0.850367 1.047287 -1.205815 -1.287821

</>复制代码

  1. pieces = [df[:3], df[3:7], df[7:]]
  2. # break it into pieces
  3. pieces
  4. [ 0 1 2 3
  5. 0 0.680581 1.918851 0.521201 -0.389951
  6. 1 0.724157 2.282989 0.648427 -0.827308
  7. 2 2.437781 0.232518 1.066197 -0.233117,
  8. 0 1 2 3
  9. 3 0.038747 3.174875 -1.384120 0.322864
  10. 4 -0.835962 1.015841 0.042094 -1.903701
  11. 5 0.095194 1.926612 0.512825 0.786349
  12. 6 -1.098231 -0.669381 -0.623124 -0.411114,
  13. 0 1 2 3
  14. 7 -1.229527 -0.738026 0.453683 -2.037488
  15. 8 -0.499546 -0.816864 -0.395079 -0.320400
  16. 9 0.850367 1.047287 -1.205815 -1.287821]

2、Append将一行连接到一个DataFrame上

</>复制代码

  1. df = pd.DataFrame(np.random.randn(8, 4), columns=["A", "B", "C", "D"])
  2. df
  3. A B C D
  4. 0 -0.923050 -1.798683 -0.543700 0.983715
  5. 1 -0.031082 1.069746 -0.761914 0.142136
  6. 2 0.178376 -0.984427 0.270601 0.737754
  7. 3 -0.882595 0.057637 -1.027661 -1.829378
  8. 4 0.570082 0.210366 0.805305 -1.233238
  9. 5 0.442322 0.709155 -0.304849 0.885378
  10. 6 -0.218852 0.052263 0.467727 0.832747
  11. 7 0.516890 0.005642 -0.990794 -1.624444

</>复制代码

  1. s = df.iloc[3]
  2. df.append(s, ignore_index=True)
  3. A B C D
  4. 0 -0.923050 -1.798683 -0.543700 0.983715
  5. 1 -0.031082 1.069746 -0.761914 0.142136
  6. 2 0.178376 -0.984427 0.270601 0.737754
  7. 3 -0.882595 0.057637 -1.027661 -1.829378
  8. 4 0.570082 0.210366 0.805305 -1.233238
  9. 5 0.442322 0.709155 -0.304849 0.885378
  10. 6 -0.218852 0.052263 0.467727 0.832747
  11. 7 0.516890 0.005642 -0.990794 -1.624444
  12. 8 -0.882595 0.057637 -1.027661 -1.829378

以上代码不想自己试一试吗?
镭矿 raquant提供 jupyter(研究) 在线练习学习 python 的机会,无需安装 python 即可运行 python 程序。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45533.html

相关文章

  • Python 数据分析 pandas 进阶(二)

    摘要:九时间序列时区表示时区转换时区跨度转换十画图图片描述十一从版本开始,可以在中支持类型的数据。 六、分组 对于group by操作,我们通常是指以下一个或多个操作步骤:(Splitting)按照一些规则将数据分为不同的组(Applying)对于每组数据分别执行一个函数(Combining)将结果组合刀一个数据结构中将要处理的数组是: df = pd.DataFrame({ ...

    lingdududu 评论0 收藏0
  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0
  • python

    Python装饰器为什么难理解? 无论项目中还是面试都离不开装饰器话题,装饰器的强大在于它能够在不修改原有业务逻辑的情况下对代码进行扩展,权限校验、用户认证、日志记录、性能测试、事务处理、缓存等都是装饰器的绝佳应用场景,它能够最大程度地对代码进行复用。 但为什么初学者对装饰器的理解如此困难,我认为本质上是对Py… Python 实现车牌定位及分割 作者用 Python 实现车牌定位及分割的实践。 ...

    chenatu 评论0 收藏0
  • Python小世界:项目虚拟环境配置的N种方法

    摘要:三个常用的虚拟环境配置来汇总,如有不适之处,还望各位大佬指正。一个项目对应一个,支持开发环境与正式环境区分。其使用创建环境,以便分隔使用不同版本和不同程序包的项目。 前言 和其他大多数现代编程语言一样,Python对包和 模块的下载、存储以及管理有其自己的一套方法。但是当我们同时开发多个项目工程的时候,不同的项目会将第三方的包存放在相同的路径下。这就意味着,如果有两个工程依赖同一个包,但是所...

    kidsamong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<