1

我有一个 Rpy2 数据框作为<class 'rpy2.robjects.vectors.DataFrame'>. 如何将其转换为 Python 列表或每行作为元素的元组?谢谢!

4

2 回答 2

1

我想到了。如果您正在寻找答案,我希望这会有所帮助:

output = [tuple([df[j][i] for j in range(df.ncol)]) for i in range(df.nrow)]
于 2013-06-25T16:11:37.210 回答
1

我最近偶然发现了一个潜在的问题。给定来自 R 的数据框:

| | 一个 | c | 乙 | d |
|---|-------|---|---|-----|
| 1 | 信息1 | 2 | 1 | op1 |
| 2 | 信息2 | 3 | 2 | 3 |
| 3 | 信息3 | 4 | 3 | 3 |
| 4 | 信息4 | 5 | 4 | 3 |
| 5 | 信息5 | 6 | 5 | 3 |
| 6 | 信息6 | 7 | 6 | 3 |
| 7 | 9 | 8 | 7 | 3 |

(是的,我知道 - 一列中的混合数据类型,即 str 和 float 可能不现实,但对于仅因子列也是如此)

转换将显示列 a 和 d 的索引,而不是通常预期的实际值。问题如 rpy2 手册中所述:

R 的因素有些特殊:它们旨在表示一个内存有效的标签向量,并且为了实现它被实现为整数向量,与一个(可能更短的)标签向量相关联。每个整数代表标签在相关标签向量中的位置。

以下粗略的代码草案是处理这种情况的一步:

colnames = list(dataframe.colnames)
rownames=list(dataframe.rownames)
col2data = []
for cn,col in dataframe.items():
    if isinstance(col,robjects.vectors.FactorVector) is True:
        colevel = tuple(col.levels)
        col = tuple(col)
        ncol = []
        for i in col:
            k=i-1
            ncol.append(colevel[k])
    else:
        ncol = tuple(col)
    col2data.append((cn,ncol))

col2data.append(('rownames',rownames))
col2data = dict(col2data)

输出是一个带有列名到值映射的字典。使用循环并转置列表列表将根据需要生成输出。

于 2014-05-26T21:36:08.590 回答