2016-05-07 21 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