【问题标题】:Create a dataframe from dictionary and both key and value are rows从字典创建一个数据框,键和值都是行
【发布时间】:2018-09-21 14:25:34
【问题描述】:

我有一个字典,其中键是患者 ID,所有键的值都相同:[1,2,3],表示每个患者将访问诊所 3 次。如何将其转换为键和值都是行的数据框?

字典:

patients = ['Patient01', 'patient02', 'patient03']
visits = [1,2,3]
dictionary = {k:visits for k in patients}

输出:

{'Patient01': [1, 2, 3],
 'patient02': [1, 2, 3],
 'patient03': [1, 2, 3]}

我试过了

pd.DataFrame.from_dict(dictionary, orient = 'index')

但输出是

            0   1   2
patient02   1   2   3
patient03   1   2   3
patient01   1   2   3

而我想要的是这样的:

          visit_num
patient01  1
patient01  2
patient01  3
patient02  1
patient02  2
patient02  3
patient03  1
patient03  2
patient03  3

【问题讨论】:

  • 你有它。很多答案可供选择。 :) #SOreadytohelp

标签: python pandas dictionary


【解决方案1】:

也许你可以试试numpy

pd.DataFrame({'visit_num':np.hstack(list(dictionary.values()))},index=np.repeat(list(dictionary.keys()),len(dictionary)))
Out[76]: 
           visit_num
Patient01          1
Patient01          2
Patient01          3
patient02          1
patient02          2
patient02          3
patient03          1
patient03          2
patient03          3

【讨论】:

    【解决方案2】:

    在您创建的数据框上使用pd.stack()

    df = pd.DataFrame.from_dict(dictionary, orient = 'index')
    
    new_df = df.stack().reset_index(level=1, drop=True).to_frame(name='visit_num')
    
    >>> new_df
               visit num
    Patient01          1
    Patient01          2
    Patient01          3
    patient02          1
    patient02          2
    patient02          3
    patient03          1
    patient03          2
    patient03          3
    

    解释说明

    df.stack 在这里完成大部分工作,使用您原来的df

               0  1  2
    Patient01  1  2  3
    patient02  1  2  3
    patient03  1  2  3
    

    并将其转换为以下多索引pandas.Series

    Patient01  0    1
               1    2
               2    3
    patient02  0    1
               1    2
               2    3
    patient03  0    1
               1    2
               2    3
    

    该行的其余部分(.reset_index().to_frame())只是为了将其转换为良好的数据帧格式。

    【讨论】:

      【解决方案3】:

      直接理解

      pd.Series(
          *zip(*((v, k) for k, c in dictionary.items() for v in c))
      ).to_frame('visit_num')
      
                 visit_num
      Patient01          1
      Patient01          2
      Patient01          3
      patient02          1
      patient02          2
      patient02          3
      patient03          1
      patient03          2
      patient03          3
      

      【讨论】:

      • 这获得了原创性 +1
      【解决方案4】:
      data = [[patient, visit_num]
              for patient, visits in dictionary.items()
              for visit_num in visits]
      df = pd.DataFrame(data, columns=['patient', 'visit_num']).set_index('patient')
      

      【讨论】:

        【解决方案5】:

        使用melt:

        df = pd.DataFrame.from_dict(dictionary, orient = 'index')
        df.reset_index()\
          .melt('index',value_name='visit_num')\
          .drop('variable', axis=1)\
          .sort_values('index') #if you wish to get your order
        

        输出:

               index  visit_num
        1  Patient01          1
        4  Patient01          2
        7  Patient01          3
        2  patient02          1
        5  patient02          2
        8  patient02          3
        0  patient03          1
        3  patient03          2
        6  patient03          3
        

        【讨论】:

          【解决方案6】:

          您可以使用itertools.product 来简化您的问题,然后使用pd.DataFrame.set_index

          import pandas as pd
          from itertools import product
          
          patients = ['Patient01', 'patient02', 'patient03']
          visits = [1, 2, 3]
          
          df = pd.DataFrame(list(product(patients, visits)), columns=['patients', 'visit_num'])\
                 .set_index('patients')
          

          【讨论】:

          • 这不是假设所有患者的就诊次数都相同吗?
          • @pault。恰恰。根据问题:“所有键的值都相同”
          猜你喜欢
          • 2022-09-28
          • 2017-10-16
          • 2017-04-30
          • 1970-01-01
          • 2021-09-16
          • 1970-01-01
          • 1970-01-01
          • 2019-03-20
          • 1970-01-01
          相关资源
          最近更新 更多