2016-05-07 39 views
2

這是爲元組創建DataFrame的正確方法嗎? (假定元組碼片段內部產生)Python:Pandas DataFrame for元組

import pandas as pd 
import numpy as np 
import random 

row = ['a','b','c'] 
col = ['A','B','C','D'] 

# use numpy for creating a ZEROS matrix 
st = np.zeros((len(row),len(col))) 
df2 = pd.DataFrame(st, index=row, columns=col) 

# CONVERT each cell to an OBJECT for inserting tuples 
for c in col: 
    df2[c] = df2[c].astype(object) 

print df2 

for i in row: 
    for j in col: 
     df2.set_value(i, j, (i+j, np.round(random.uniform(0, 1), 4))) 

print df2 

正如你可以看到我首先在numpy的創建zeros(3,4)再發每個單元的對象類型中熊貓所以可以插入的元組。這是正確的方法嗎?還是有一個更好的解決方案ADD/RETRIVE元組到矩陣?

結果都很好:

A B C D 
a 0 0 0 0 
b 0 0 0 0 
c 0 0 0 0 


      A    B    C    D 
a (aA, 0.7134) (aB, 0.006) (aC, 0.1948) (aD, 0.2158) 
b (bA, 0.2937) (bB, 0.8083) (bC, 0.3597) (bD, 0.324) 
c (cA, 0.9534) (cB, 0.9666) (cC, 0.7489) (cD, 0.8599) 
+0

DataFrames實際上是爲了在每個單元格中存儲標量值而設計的。你爲什麼要存儲元組? –

+0

我正在設計一個HMM /維特比類,所以我必須存儲概率和之前創建該概率的狀態,以便稍後可以檢索最佳後向路徑。 – Rebin

+0

爲什麼不把它們存儲在單獨的列中? –

回答

6

首先,要回答你的問題的文字:您可以從列表的列表構造DataFrames。在列出的清單中的值本身也可以是元組:

import numpy as np 
import pandas as pd 
np.random.seed(2016) 

row = ['a','b','c'] 
col = ['A','B','C','D'] 

data = [[(i+j, round(np.random.uniform(0, 1), 4)) for j in col] for i in row] 
df = pd.DataFrame(data, index=row, columns=col) 
print(df) 

產生

   A    B    C    D 
a (aA, 0.8967) (aB, 0.7302) (aC, 0.7833) (aD, 0.7417) 
b (bA, 0.4621) (bB, 0.6426) (bC, 0.2249) (bD, 0.7085) 
c (cA, 0.7471) (cB, 0.6251) (cC, 0.58) (cD, 0.2426) 

說了這麼多,提防存儲元組DataFrames註定你Python的速度循環。要利用快速Pandas/NumPy例程,您需要使用本機NumPy dtypes,如np.float64(而相反,元組需要「object」dtype)。

因此,也許你的目的更好的解決方案是使用兩個單獨的DataFrames,一個用於字符串和一個數字:通過列

import numpy as np 
import pandas as pd 
np.random.seed(2016) 

row=['a','b','c'] 
col=['A','B','C','D'] 

prevstate = pd.DataFrame([[i+j for j in col] for i in row], index=row, columns=col) 
prob = pd.DataFrame(np.random.uniform(0, 1, size=(len(row), len(col))).round(4), 
        index=row, columns=col) 
print(prevstate) 
#  A B C D 
# a aA aB aC aD 
# b bA bB bC bD 
# c cA cB cC cD 

print(prob) 
#   A  B  C  D 
# a 0.8967 0.7302 0.7833 0.7417 
# b 0.4621 0.6426 0.2249 0.7085 
# c 0.7471 0.6251 0.5800 0.2426 

要循環,找到最大概率的行和檢索相應prevstate,你可以使用.idxmax.loc

for col in prob.columns: 
    idx = (prob[col].idxmax()) 
    print('{}: {}'.format(prevstate.loc[idx, col], prob.loc[idx, col])) 

產生

aA: 0.8967 
aB: 0.7302 
aC: 0.7833 
aD: 0.7417 
+0

非常整潔深刻理解。 TNX – Rebin