Saya perlu memutar kerangka data (dfM) yang terlihat seperti

Task Question Answer analystID
x    a        1      u
y    b        2      i
z    c        3      o

Pada awalnya saya pikir poros saya

 dfM = pd.pivot_table(dfM, index = ['Task', 'Question'], columns = 'analystID', 
                     values = ['Answer'])

Mendapatkan kesalahan itu (Tidak ada tipe numerik untuk digabungkan) karena angka di bawah kolom Jawaban mungkin berupa string, jadi saya mencoba

dfM.apply(pd.to_numeric, errors='ignore')

Tapi saya masih mendapatkan kesalahan yang sama.

Apakah ada cara saya dapat memperbaiki kesalahan ini?

1
Matthew 16 Agustus 2017, 19:03

2 jawaban

Jawaban Terbaik

Saya pikir Anda perlu mengonversi kolom Answer menjadi int atau float saja, lalu hapus [] dari parameter values tanpa MultiIndex di kolom:

dfM['Answer'] = dfM['Answer'].astype(int)
df = pd.pivot_table(dfM, index = ['Task', 'Question'], columns = 'analystID', 
                     values = 'Answer')
print (df)
analystID        i    o    u
Task Question               
x    a         NaN  NaN  1.0
y    b         2.0  NaN  NaN
z    c         NaN  3.0  NaN

Jika solusi pertama gagal, ada beberapa nilai non numerik. Jadi perlu to_numeric dengan parameter errors='coerce' untuk mengganti non numerik menjadi NaNs.

dfM['Answer'] = pd.to_numeric(dfM['Answer'], errors='coerce')
df = pd.pivot_table(dfM, index = ['Task', 'Question'], columns = 'analystID', 
                     values = 'Answer')
print (df)
analystID        i    o    u
Task Question               
x    a         NaN  NaN  1.0
y    b         2.0  NaN  NaN
z    c         NaN  3.0  NaN

Solusi satu baris dengan assign:

df = pd.pivot_table(dfM.assign(Answer=dfM['Answer'].astype(int)), 
                     index = ['Task', 'Question'], 
                     columns = 'analystID', 
                     values = 'Answer')
print (df)
analystID        i    o    u
Task Question               
x    a         NaN  NaN  1.0
y    b         2.0  NaN  NaN
z    c         NaN  3.0  NaN

EDIT:

Jika menggunakan parameter errors='ignore' dan beberapa nilai non numerik, masih mendapatkan kesalahan:

print (dfM)
  Task Question Answer analystID
0    x        a      r         u <-first ansswer value was changed to `r`
1    y        b      2         i
2    z        c      3         o

dfM['Answer'] = pd.to_numeric(dfM['Answer'], errors='ignore')

DataError: Tidak ada tipe numerik untuk digabungkan

1
jezrael 16 Agustus 2017, 16:41

Cobalah untuk menetapkan kembali pernyataan apply Anda kembali ke dfM.

dfM = dfM.apply(pd.to_numeric, errors='ignore')
dfM = pd.pivot_table(dfM, index = ['Task', 'Question'], columns = 'analystID', 
                     values = ['Answer'])

              Answer          
analystID          i    o    u
Task Question                 
x    a           NaN  NaN  1.0
y    b           2.0  NaN  NaN
z    c           NaN  3.0  NaN
1
Scott Boston 16 Agustus 2017, 16:08