来自元组的 Pandas DataFrame 列

Posted

技术标签:

【中文标题】来自元组的 Pandas DataFrame 列【英文标题】:Pandas DataFrame column from a tuple 【发布时间】:2016-08-25 02:34:21 【问题描述】:

我有一本字典:

employer =  
'CrntEmp_city': ('XXX', 'XXX'),
'CrntEmp_cntry': ('XXX', 'XXX'),
'CrntEmp_orgNm': ('XXXX LLC', 'YYYY LLC'),
'CrntEmp_orgPK': ('1234567891', '1234567899'),
'CrntEmp_postlCd': ('12345', '12345'),
'CrntEmp_state': ('AK', 'AK'),
'CrntEmp_str1': ('999 XXX', '999 XXX'),
'CrntEmp_str2': ('XXXX', 'XXXX')

我想将其读入一个 DataFrame,其中 一行八列 对应于键。但是无论我尝试如何,pandas 总是会给我两列(通过拆分逗号所在的元组)。示例:

pd.DataFrame([tuple(i) for i in employ.values()])


returns 
    0           1
0   XXXX LLC    YYYY LLC
1   XXXX        XXXX
2   999 XXX     999 XXX
3   XXX         XXX
4   12345       12345
5   XXX         XXX
6   AK          AK
7   1234567891  1234567899

我想要的是这个:

     0                    1
 0  (XXXX LLC, YYYY LLC)  (XXXX, XXXX)
 etc.

因此此命令失败:

pd.DataFrame([tuple(i) for i in  employ.values()],columns=employ.keys(),index=[0])

有什么想法吗?

【问题讨论】:

【参考方案1】:

你基本上想要这样的东西:pd.DataFrame('col1': [(a, b)], 'col2': [(c, d)])

您可以在 Python 2 中使用如下的字典推导来实现这一点。对于 Python 3,请改用 employer.iter()

>>> pd.DataFrame(k: [tuple(v)] for k, v in employer.iteritems())

  CrntEmp_city CrntEmp_cntry         CrntEmp_orgNm             CrntEmp_orgPK CrntEmp_postlCd CrntEmp_state        CrntEmp_str1  CrntEmp_str2
0   (XXX, XXX)    (XXX, XXX)  (XXXX LLC, YYYY LLC)  (1234567891, 1234567899)  (12345, 12345)      (AK, AK)  (999 XXX, 999 XXX)  (XXXX, XXXX)

【讨论】:

谢谢,这行得通。 Pandas 确实应该有一个内置选项。【参考方案2】:

尝试通过首先将数据定义为系列来强制数据为一列:

import pandas as pd

pd.DataFrame(data=pd.Series(employer.values()))

然后输出匹配您的示例所需结果(与您的原始描述不匹配,但我假设您可以从此处获取)。

                          0
0      (XXXX LLC, YYYY LLC)
1              (XXXX, XXXX)
2        (999 XXX, 999 XXX)
3                (XXX, XXX)
4            (12345, 12345)
5                (XXX, XXX)
6                  (AK, AK)
7  (1234567891, 1234567899)

【讨论】:

【参考方案3】:

我觉得你可以用iteritems():

import pandas as pd

employer = 'CrntEmp_city': ('XXX', 'XXX'),
'CrntEmp_cntry': ('XXX', 'XXX'),
'CrntEmp_orgNm': ('XXXX LLC', 'YYYY LLC'),
'CrntEmp_orgPK': ('1234567891', '1234567899'),
'CrntEmp_postlCd': ('12345', '12345'),
'CrntEmp_state': ('AK', 'AK'),
'CrntEmp_str1': ('999 XXX', '999 XXX'),
'CrntEmp_str2': ('XXXX', 'XXXX')

print pd.DataFrame([i for i in employer.iteritems()])
                 0                         1
0    CrntEmp_orgNm      (XXXX LLC, YYYY LLC)
1     CrntEmp_str2              (XXXX, XXXX)
2     CrntEmp_str1        (999 XXX, 999 XXX)
3    CrntEmp_cntry                (XXX, XXX)
4  CrntEmp_postlCd            (12345, 12345)
5     CrntEmp_city                (XXX, XXX)
6    CrntEmp_state                  (AK, AK)
7    CrntEmp_orgPK  (1234567891, 1234567899)

【讨论】:

感谢您的回复,但在调用 pd.DataFrame 作为我的函数的一部分时,我需要一行和读入的列。该解决方案需要不止一步才能将数据转换为所需的格式。

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

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

Pandas DataFrame 删除元组或列列表

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

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

pandas索引复合索引dataframe数据索引dataframe中指定行和指定列交叉格子的数据内容(getting a specific value)使用元组tuple表达复合索引的指定行

使用元组键从字典创建 MultiIndex pandas DataFrame