Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从字典创建一个数据框,键和值都是行_Python_Pandas_Dictionary - Fatal编程技术网

Python 从字典创建一个数据框,键和值都是行

Python 从字典创建一个数据框,键和值都是行,python,pandas,dictionary,Python,Pandas,Dictionary,我有一个字典,其中键是患者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

我有一个字典,其中键是患者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

您可以使用
itertools.product
来简化您的问题,然后使用
pd.DataFrame.set\u 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')
在您创建的数据帧上使用:

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
并将其转换为以下多索引的熊猫系列:

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()
)就是为了将其转换成一个好的数据帧格式。

也许您可以尝试使用
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
使用:

输出:

       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

完全理解

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

这不是假设所有患者的就诊次数相同吗?@pault。精确地根据问题:“所有键的值都是相同的”,您就有了它。有很多答案可供选择。:)#SOREADYTOHELPHIS的创意得分为+1
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')
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