iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 28
0
Software Development

python 自學系列 第 28

python day28(Pandas)

  • 分享至 

  • xImage
  •  

Pandas 可以把資料轉成單維度或雙維度的格式,並提供很多好用的 api 來對資料做處理.

在 Pandas 有兩個重要的觀念

  1. 單維度 Series,有點類似 table 只有一個欄位的資料.
  2. 雙維度 DataFrame,就像 table 一樣有行跟列可以做處理.

安裝 Pandas

pip3 install pandas

Series

使用 list 建立 Series 資料,左邊是編號從 0 開始,右邊的是資料型態是 int64

import pandas as pd
>>> data = pd.Series([1,2,3,4,5,6])
>>> print(data)
0    1
1    2
2    3
3    4
4    5
5    6
dtype: int64

也可以自定義索引給 index 參數

>>> data = pd.Series([1,2,3],index=['a','b','c'])
>>> data
a    1
b    2
c    3
dtype: int64

Series 已經提供了一些 api 可以使用,也可以對資料全部操作.

>>> data = pd.Series([1,2,3,4,5,6])
# # 取最大值
>>> data.max()
6
# 取最小值
>>> data.min()
1
# 取中位數
>>> data.median()
3.5
# 將元素都 * 3
>>> data = data * 3
>>> print(data)
0     3
1     6
2     9
3    12
4    15
5    18
dtype: int64
# 取前 3 大的數字
>>> data.nlargest(3)
5    6
4    5
3    4
dtype: int64
# 取最小的 2 個數字
>>> data.nsmallest(2)
0    1
1    2
dtype: int64

檢查 Series 的資料是否有等於 12 結果會是 boolean 值.

>>> data = data == 12
>>> print(data)
0    False
1    False
2    False
3     True
4    False
5    False
dtype: bool

如果 Series 內容是字串也有提供很多 api 可以使用

>>> data = pd.Series(['Daniel','Jack','Sam'])

# 轉小寫
>>> data.str.lower()
0    daniel
1      jack
2       sam
dtype: object

# 將 list 所有的字串元素用分隔符號 ';' 組成字串
>>> data.str.cat(sep=';')
'Daniel;Jack;Sam'

# 看是否包含 'a' 字串
>>> data.str.contains('a')
0    True
1    True
2    True
dtype: bool

# replace 字串
>>> data.str.replace('Daniel','Allen')
0    Allen
1     Jack
2      Sam
dtype: object

DataFrame

使用 dictionary 的資料建立 DataFrame

import pandas as pd
>>> data = pd.DataFrame({'name':['Daniel','Sam','Jack'],'age':[20,30,35]})
>>> print(data)
     name  age
0  Daniel   20
1     Sam   30
2    Jack   35

取得 name 該行的資料

>>> data['name']
0    Daniel
1       Sam
2      Jack
Name: name, dtype: object

取得第一列的資料

>>> data.iloc[0]
name    Daniel
age         20
Name: 0, dtype: object

上一篇
python day27(pytest)
下一篇
python day29(NumPy)
系列文
python 自學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
山姆大叔
iT邦新手 4 級 ‧ 2019-10-13 14:15:45

這個也叫DataFrame耶!
感覺可以跟Spark整合的樣子?

確實是可以

# 執行時指定 python3
> export PYSPARK_PYTHON=python3;./pyspark
Python 3.7.4 (v3.7.4:e09359112e, Jul  8 2019, 14:54:52)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
19/10/14 10:55:04 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.4.4
      /_/

Using Python version 3.7.4 (v3.7.4:e09359112e, Jul  8 2019 14:54:52)
SparkSession available as 'spark'.
>>> import numpy as np
>>> import pandas as pd
# 建立 pandas dataframe
>>> pd_dataframe = pd.DataFrame(np.random.rand(100, 3))
>>> print(pd_dataframe)
           0         1         2
0   0.707611  0.895502  0.438209
1   0.406409  0.849364  0.518608
2   0.116227  0.183316  0.437908
3   0.145072  0.086041  0.673216
4   0.196261  0.632940  0.257096
..       ...       ...       ...
95  0.095377  0.068018  0.415200
96  0.061066  0.395440  0.447733
97  0.756381  0.715175  0.680191
98  0.289684  0.869211  0.987092
99  0.420487  0.987588  0.824905

[100 rows x 3 columns]
>>> type(pd_dataframe)
<class 'pandas.core.frame.DataFrame'>

#轉成 spark dataframe 
>>> spark_dataframe = spark.createDataFrame(pd_dataframe)
>>> type(spark_dataframe)
<class 'pyspark.sql.dataframe.DataFrame'>
>>> spark_dataframe.show(5)
+-------------------+-------------------+-------------------+
|                  0|                  1|                  2|
+-------------------+-------------------+-------------------+
| 0.7076107872426695| 0.8955019630532672|0.43820855633673794|
|0.40640948432256474| 0.8493643694516027| 0.5186082617314527|
|0.11622692146929692|0.18331601340671733| 0.4379077613719029|
|0.14507236330860762|0.08604079366559259| 0.6732164093020134|
|0.19626068783595485| 0.6329403382263261| 0.2570959487618999|
+-------------------+-------------------+-------------------+
only showing top 5 rows

#再把 spark dataframe 轉成 pandas dataframe
>>> pd_r_dataframe = spark_dataframe.select("*").toPandas()
>>> type(pd_r_dataframe)
<class 'pandas.core.frame.DataFrame'>
>>> print(>>>
>>> print(pd_r_dataframe)
           0         1         2
0   0.707611  0.895502  0.438209
1   0.406409  0.849364  0.518608
2   0.116227  0.183316  0.437908
3   0.145072  0.086041  0.673216
4   0.196261  0.632940  0.257096
..       ...       ...       ...
95  0.095377  0.068018  0.415200
96  0.061066  0.395440  0.447733
97  0.756381  0.715175  0.680191
98  0.289684  0.869211  0.987092
99  0.420487  0.987588  0.824905

[100 rows x 3 columns]

我要留言

立即登入留言