iT邦幫忙

0

python 資料處理

小弟想利用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

根據小弟測試,好像是最後一欄有小數點那部分出問題
想問一下有甚麼辦法解決或是有更好的寫法

看更多先前的討論...收起先前的討論...
幹嘛重複兩次?
franx0722 iT邦新手 5 級 ‧ 2021-03-26 17:13:01 檢舉
df_my_author.iloc[df_my_books.iloc[j,i],i]
的df_my_books.iloc[j,i] 假設是0,0 對應數字0 可能不會錯因為有可能不超過絕對位置最大值 但如果是其他位置對應到字串 就會錯了
phes11434 iT邦新手 5 級 ‧ 2021-03-26 17:30:05 檢舉
@微甜的酸
不好意思,你是說哪部分重複
phes11434 iT邦新手 5 級 ‧ 2021-03-26 17:32:31 檢舉
@franx0722
字串部分會正確被轉換過來
@phes11434 沒,我看懂了><

2 個回答

0
mackuo
iT邦新手 5 級 ‧ 2021-03-29 12:10:28
最佳解答

我來獻醜一下:

第一種方式:

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

https://ithelp.ithome.com.tw/upload/images/20210329/20122335Iiaxwm6pgM.png

phes11434 iT邦新手 5 級 ‧ 2021-03-29 13:58:28 檢舉

感覺這做法跟我原本得差不多
只是差在你是建空資料表
我還是不懂我原本那個做法怎麼g欄會出問題

mackuo iT邦新手 5 級 ‧ 2021-03-29 14:06:40 檢舉

這是我一開始的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欄一直出錯如下:

https://ithelp.ithome.com.tw/upload/images/20210329/20122335KW7dRJ5mDd.png

phes11434 iT邦新手 5 級 ‧ 2021-04-07 22:30:23 檢舉

我覺得第一種寫法就蠻好的,但因為資料量不大,其實很難說哪個效率比較好

1
微甜的酸
iT邦新手 3 級 ‧ 2021-03-27 08:12:03

只寫到這裡ㄗㄐ+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

我要發表回答

立即登入回答