DataFrame

很好用的資料類型

[] 中括號

「取出」之意,其中可以是索引或欄位名。

參考:https://www.learncodewithmike.com/2020/11/python-pandas-dataframe-tutorial.html

new DataFrame

# 建立一個單純空DataFrame
df = pd.DataFrame()

# 建立一個指定column但無資料的DataFrame
df = pd.DataFrame(columns=['colA', 'colB', 'colC'])

# 已經有資料的狀況建立為一個DataFrame
df = pd.DataFrame({'colA': 'valA', 'colB': 'valB', 'colC': 'valC'})

set data

# 在資料尾端加入新資料
df.loc[len(df)] = data
# data可以是list(與columns數量一致),也可以是dict(與columns名一至)

addign 增加一欄的資料

EX
#建立一個DataFrame
result = pd.DataFrame({'fieldX': [17.0, 25.0]}, index=['AAA', 'BBB'])
>        fieldX
> AAA    17.0
> BBB    25.0

# df增加欄「fieldY」,值為「fieldX的值+1.1」
result = result.assign(fieldY=lambda x: x.fieldX + 1.1) # assign會對每一列執行lambda,並將該列作為變數傳入(x),回傳值放入宣告的新欄位(fieldY)中
>        fieldX  fieldY
> AAA    17.0    18.1
> BBB    25.0    26.1

參考:https://www.gairuo.com/p/pandas-assign

get out columns name 取得所有欄位名

data.columns
> Index(['PRODUCT', 'TEST_PROG', 'LOT', 'WAFER', 'TEST_TYPE', 'YIELD', 'BIN_NAME', 'BIN_RATIO'], dtype='object')

df.columns.values
# 取得一list

修改列名

df = df.rename(columns={'A': 'new_A', 'B': 'new_B', 'C': 'new_C'})

get row size

len(data.index)

不能用data.size,這只會取得資料空間大小,而非筆數。

get frist row data

取得第一筆資料(非欄位名行)

data.loc[0] # 取得「index=0」的資料
data['30'].loc[0] # 取得「欄位名=30 index=0」的資料

index有可能不是流水,要看資料實際的index

sql取出或自行append的預設會是流水,但也有可能合併之類的操作導致跳號重號,要注意!

https://www.delftstack.com/zh-tw/howto/python-pandas/pandas-get-first-row-of-given-column/

get row by index

data.loc[0] # 第一列資料
data.loc[0, 'X'] # 第一列X欄的資料

get out datas by column name

# 取出DataFrame中多個欄位的資料(return一個新DataFrame)
new_df = df[['COMPONENTID', 'SPEC_LOW', 'SPEC_HIGH']]

get out data from row

範例用data如下

fieldA fieldB

row1 value1 value2

row2 value3 value4

有兩種方法:

  1. 指定欄位名

  2. 指定第幾欄

1.指定欄位名
for index, row in data.iterrows():
    row[fieldA] #value1(第二圈value3)
2.指定第幾欄
for index, row in data.iterrows():
    row[1] #value2(第二圈value4)

迴圈取row需要使用index時,需視情況先reset_index! 否則index有可能未從頭(原資料過濾或截斷會保留index)。

for index, row in df.reset_index().iterrows():
# df.reset_index(drop=True) 可直接處理df本體(但return是None!)
# 另有參數inplace尚未確定怎麼用 df.reset_index(drop=True, inplace=True)

獲取某列中唯一值

獲取X列的唯一值
df['X'].unique()

foreach

for index, row in data.iterrows():

這方法效率並不好!如果要進行的工作有DataFrame預設方法可處理,盡量不要使用此foreach方式!

filter 過濾

filter = data['PRODUCT'] == 'XXX'  # 建立過濾器是「data的PRODUCT欄位值=XXX」的
data = data[filter]  # data=套用過濾器取出的資料

data = data[data['PRODUCT'] == 'XXX']  # 簡短的寫取出A欄位中值非None的資料列

EX

取出A欄位中值非None的資料列

取出AB欄位中值皆非None的資料列

第三維度

DataFrame 是一個二維表格結構,因此在一個 DataFrame 中,資料只會以行和列的方式顯示,並沒有第三個維度。

可以將一個 DataFrame 中的某一欄位或某一列視為另一個 DataFrame,這樣可以將 DataFrame 組合起來形成更複雜的結構。

EX

將某一列視為一個矩陣
import pandas as pd

# 建立一個 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})

# 取出 df 中的第 2 列,並轉換為矩陣
matrix = df.iloc[1].values.reshape(1, -1)

在這個例子中,我們從 DataFrame df 中取出了第 2 列,然後將它轉換為一個矩陣,並輸出。

這樣就可以將 DataFrame 轉換為一個矩陣,然後進行相關的操作。

然而,需要注意的是,這裡的矩陣不再是一個完整的 DataFrame,只是 DataFrame 中某一部分的資料,因此不能再進行 DataFrame 相關的操作,例如新增或刪除列等操作。

顯示完整資料

如果是在pycharm開發,直接在debug模式下,點開資料的view,就可以查看到table樣式的資料。

當資料欄位多,又想要用print查看所有資料內容。

# 設定DataFrame顯示完整列資料
pd.set_option('display.max_columns', None)

Last updated