【问题标题】:Pandas DataFrame column from a tuple来自元组的 Pandas DataFrame 列
【发布时间】: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])

有什么想法吗?

【问题讨论】:

    标签: python dictionary pandas tuples


    【解决方案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 作为我的函数的一部分时,我需要一行和读入的列。该解决方案需要不止一步才能将数据转换为所需的格式。
      猜你喜欢
      • 2023-02-24
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      相关资源
      最近更新 更多