Python:用于元组的 Pandas DataFrame

Posted

技术标签:

【中文标题】Python:用于元组的 Pandas DataFrame【英文标题】:Python: Pandas DataFrame for tuples 【发布时间】:2016-09-02 16:42:42 【问题描述】:

这是为元组创建 DataFrame 的正确方法吗? (假设元组是在代码片段中创建的)

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),然后在 Pandas 中将每个单元格设为 OBJECT 类型,这样我就可以插入元组。这是正确的做法还是有更好的解决方案将元组添加/检索到矩阵?

结果很好:

   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)

【问题讨论】:

DataFrame 的设计目的是在每个单元格中存储一个标量值。为什么要存储元组? 我正在设计一个 HMM/Viterbi 类,所以我必须存储概率和创建该概率的先前状态,以便稍后我可以检索最佳反向路径。 为什么不将这些存储在单独的列中? 您能否详细说明您的问题?例如,我如何根据您的想法在 b-C 的横截面检索内容? 现在我可以设置/获取 ('bC', 0.36) 元组中的第一个值是否总是“等于”单元格的行索引加上列索引? 【参考方案1】:

首先,回答您的字面问题:您可以从列表列表中构造 DataFrame。列表列表中的值本身可以是元组:

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)

话虽如此,但请注意,将元组存储在 DataFrame 中会使您陷入 Python 速度循环。要利用快速的 Pandas/NumPy 例程,您需要使用原生 NumPy dtype,例如 np.float64(相比之下,元组需要“object”dtype)。

因此,对于您的目的来说,也许更好的解决方案是使用两个单独的 DataFrame,一个用于字符串,一个用于数字:

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

【讨论】:

َ非常简洁和深刻的理解。 tnx

以上是关于Python:用于元组的 Pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

来自元组的 Pandas DataFrame 列

Pandas 替换列中的值,但 to_replace 参数是包含元组的元组

将元组的无序列表转换为 pandas DataFrame

python元组的用法

对包含 str 和元组的 Pandas MultiIndex 进行排序

如何最好地将包含列表或元组的 Pandas 列提取到多个列中[重复]