本文的起源來自於iThelp中網友的提問:
程式碼是我自已寫的。
import pandas as pd import numpy as np df1 = pd.read_excel('實驗設計試解.xlsx', sheet_name = '實驗設計') df2 = pd.read_excel('實驗設計試解.xlsx', sheet_name = '水準表') df = pd.DataFrame(np.full((6, 7), np.nan)) df.columns = list(df1.columns) print('實驗設計組合:') df1
實驗設計組合:
Out[1]:
| a | b | c | d | e | f | g | |
|---|---|---|---|---|---|---|---|
| 0 | 0 | 2 | 1 | 0 | 1 | 2 | 2 | 
| 1 | 1 | 1 | 2 | 1 | 0 | 1 | 0 | 
| 2 | 2 | 0 | 0 | 2 | 2 | 0 | 1 | 
| 3 | 0 | 2 | 1 | 2 | 0 | 1 | 2 | 
| 4 | 1 | 1 | 2 | 0 | 2 | 0 | 1 | 
| 5 | 2 | 0 | 0 | 1 | 1 | 2 | 0 | 
In [2]:
print('水準表:') df2
水準表:
Out[2]:
| 水準 | a | b | c | d | e | f | g | |
|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 24 | 1 | 32 | Sigmoid | SGD | 64 | 0.01 | 
| 1 | 1 | 72 | 3 | 64 | Tanh | RMSprop | 128 | 0.05 | 
| 2 | 2 | 144 | 6 | 128 | ReLU | Adam | 256 | 0.10 | 
In [3]:
print('預期結果:') df
預期結果:
Out[3]:
| a | b | c | d | e | f | g | |
|---|---|---|---|---|---|---|---|
| 0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 
| 1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 
| 2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 
| 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 
| 4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 
| 5 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 
In [4]:
print('這種寫法會有語法上的問題:') for i in df.columns: for j in df.index: df[i][j] = df2[i][df1[i][j]] df
這種寫法會有語法上的問題:
c:userssuperuserminiconda3libsite-packagesipykernel_launcher.py:4: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy after removing the cwd from sys.path. c:userssuperuserminiconda3libsite-packagespandascoreindexing.py:205: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy self._setitem_with_indexer(indexer, value)
Out[4]:
| a | b | c | d | e | f | g | |
|---|---|---|---|---|---|---|---|
| 0 | 24.0 | 6.0 | 64.0 | Sigmoid | RMSprop | 256.0 | 0.10 | 
| 1 | 72.0 | 3.0 | 128.0 | Tanh | SGD | 128.0 | 0.01 | 
| 2 | 144.0 | 1.0 | 32.0 | ReLU | Adam | 64.0 | 0.05 | 
| 3 | 24.0 | 6.0 | 64.0 | ReLU | SGD | 128.0 | 0.10 | 
| 4 | 72.0 | 3.0 | 128.0 | Sigmoid | Adam | 64.0 | 0.05 | 
| 5 | 144.0 | 1.0 | 32.0 | Tanh | RMSprop | 256.0 | 0.01 | 
In [5]:
print('另一種更有效率的寫法:') df = pd.DataFrame(np.full((6, 7), np.nan)) df.columns = list(df1.columns) for x in df.columns: for y in df2.index: df[x] = np.where(df1[x] == y, df2[x][y], df[x]) df
另一種更有效率的寫法:
Out[5]:
| a | b | c | d | e | f | g | |
|---|---|---|---|---|---|---|---|
| 0 | 24.0 | 6.0 | 64.0 | Sigmoid | RMSprop | 256.0 | 0.10 | 
| 1 | 72.0 | 3.0 | 128.0 | Tanh | SGD | 128.0 | 0.01 | 
| 2 | 144.0 | 1.0 | 32.0 | ReLU | Adam | 64.0 | 0.05 | 
| 3 | 24.0 | 6.0 | 64.0 | ReLU | SGD | 128.0 | 0.10 | 
| 4 | 72.0 | 3.0 | 128.0 | Sigmoid | Adam | 64.0 | 0.05 | 
| 5 | 144.0 | 1.0 | 32.0 | Tanh | RMSprop | 256.0 | 0.01 | 
In [6]:
print('改良自第一種,修正語法:') df = df1 for x in df.columns: for y in df2.index: df.loc[df[x] == y, x] = df2[x][y] df
改良自第一種,修正語法:
Out[6]:
| a | b | c | d | e | f | g | |
|---|---|---|---|---|---|---|---|
| 0 | 24 | 6 | 64 | Sigmoid | RMSprop | 256 | 0.10 | 
| 1 | 72 | 3 | 128 | Tanh | SGD | 128 | 0.01 | 
| 2 | 144 | 3 | 32 | ReLU | Adam | 64 | 0.05 | 
| 3 | 24 | 6 | 64 | ReLU | SGD | 128 | 0.10 | 
| 4 | 72 | 3 | 128 | Sigmoid | Adam | 64 | 0.05 | 
| 5 | 144 | 3 | 32 | Tanh | RMSprop | 256 | 0.01 |