小弟想利用python做取代的功能
我想將這兩張表(A、B)作一些整理
A表(實驗設計組合):
a|b|c|d|e|f|g
------------- | -------------
0|2|1|0|1|2|2
1|	1|	2|	1|	0|	1|	0
2|	0|	0|	2|	2|	0|	1
0|	2|	1|	2|	0|	1|	2
1|	1|	2|	0|	2|	0|	1
2|	0|	0|	1|	1|	2|	0
B表(水準表):
水準|a|b|c|d|e|f|g
------------- | -------------
0|24|	1|	32|	Sigmoid|	SGD|	64|	0.01
1|72|	3|	64|	Tanh|	RMSprop|	128|	0.05
2|144|	6|	128|	ReLU|	Adam|	256|	0.1
想呈現如下結果:
C表(結果)
a|b|c|d|e|f|g
------------- | -------------
24|         6|     64|  Sigmoid|  RMSprop|         256|      0.1
72|         3|    128|     Tanh|      SGD|         128|      0.01
144|         1|     32|     ReLU|     Adam|          64|      0.05
24|         6|     64|     ReLU|      SGD|         128|      0.1
72|         3|    128|  Sigmoid|     Adam|          64|      0.05
144|         1|     32|     Tanh|  RMSprop|         256|      0.01
小弟是這樣做的
# 读取表
df_my_books = pd.DataFrame(pd.read_excel('./實驗設計組合.xlsx', sheet_name='工作表1'))
df_my_author = pd.DataFrame(pd.read_excel('./水準表.xlsx', sheet_name='工作表1'))
df_my_books1=df_my_books
for i in range(0,df_my_books.shape[1]):
    for j in range(0,df_my_books.shape[0]):
        
        df_my_books1.iloc[j,i]=df_my_author.iloc[df_my_books.iloc[j,i],i]
        
df_my_books1
但結果會出現這個錯誤
ValueError: Location based indexing can only have [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array] types
根據小弟測試,好像是最後一欄有小數點那部分出問題
想問一下有甚麼辦法解決或是有更好的寫法
我來獻醜一下:
第一種方式:
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)
for i in df.columns:
    for j in df.index:
        df[i][j] = df2[i][df1[i][j]]
df
第二種方式,應該效率再好一點:
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)
for x in df.columns:
  for y in df2.index:
    df[x] = np.where(df1[x] == y, df2[x][y], df[x])
df
第三種方式,改良第一種的語法:
import pandas as pd
import numpy as np
df1 = pd.read_excel('實驗設計試解.xlsx', sheet_name = '實驗設計')
df2 = pd.read_excel('實驗設計試解.xlsx', sheet_name = '水準表')
df = df1
for x in df.columns:
  for y in df2.index:
    df.loc[df[x] == y, x] = df2[x][y]
df

感覺這做法跟我原本得差不多
只是差在你是建空資料表
我還是不懂我原本那個做法怎麼g欄會出問題
這是我一開始的code:
import pandas as pd
import numpy as np
df1 = pd.read_excel('實驗設計試解.xlsx', sheet_name = '實驗設計')
df2 = pd.read_excel('實驗設計試解.xlsx', sheet_name = '水準表')
df = df1.copy()
#df = pd.DataFrame(np.full((6, 7), np.nan))
#df.columns = list(df1.columns)
for i in df.columns:
    for j in df.index:
        df[i][j] = df2[i][df1[i][j]]
df
結果也是g欄一直出錯如下:

我覺得第一種寫法就蠻好的,但因為資料量不大,其實很難說哪個效率比較好
只寫到這裡ㄗㄐ+U
import pandas as pd
cbt = pd.read_excel("./excel.xlsx", sheet_name="實驗設計組合")
alg = pd.read_excel("./excel.xlsx", sheet_name="水準表")
for _, row in cbt.iterrows():
  row[sorted(cbt)] = 1
結果是cbt變1