来自元组的Pandas DataFrame列

时间:2016-04-29 20:10:12

标签: python dictionary pandas tuples

我有一本字典:

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 ,其中一行,八列与键对应。但是我尝试这个,大熊猫总会给我两列(通过分割逗号所在的元组)。例如:

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])

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

你基本上想要这样的东西: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)

答案 1 :(得分:1)

我认为你可以使用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)

答案 2 :(得分:0)

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

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)