Python 从字典创建一个数据框,键和值都是行
我有一个字典,其中键是患者ID,所有键的值都相同:[1、2、3],表示每个患者将访问诊所3次。如何将其转换为键和值都是行的数据帧 字典: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
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