为了账号安全,请及时绑定邮箱和手机立即绑定

如何从具有相同键值的两个字典创建一个熊猫数据框?

如何从具有相同键值的两个字典创建一个熊猫数据框?

PIPIONE 2021-06-04 18:13:26
假设我有两个以下形式的字典:{'A':[1,2,3,4,5,6,7], 'B':[12,13,14,15,16,17,18} - Belongs to category "M"{'A':[8,9,10,11,12,13,14], 'B':[18,19,20,21,22,23,24]} - Belongs to category "P"现在生成的数据框应该是这样的形式——Name . Value . CategoryA    .  1    .  MA    .  8    .  PA    .  10   .  PB    .  12   .  M等等。如何实现这样的目标?
查看完整描述

2 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

设置


d1 = {'A': [1, 2, 3, 4, 5, 6, 7], 'B': [12, 13, 14, 15, 16, 17, 18]}

d2 = {'A': [8, 9, 10, 11, 12, 13, 14], 'B': [18, 19, 20, 21, 22, 23, 24]}


categories = ['M', 'P']

dcts = [d1, d2]

假设您知道哪个类别与哪个字典对应,您可以重组您的字典并使用concat:


dfs = [

    pd.DataFrame([[k, el, cat] for k, v in dct.items() for el in v])

    for dct, cat in zip(dcts, categories)

]


cols = {'columns': {0: 'Name', 1: 'Value', 2: 'Category'}}

pd.concat(dfs).reset_index(drop=True).rename(**cols)

   Name  Value Category

0     A      1        M

1     A      2        M

2     A      3        M

3     A      4        M

4     A      5        M

5     A      6        M

6     A      7        M

7     B     12        M

8     B     13        M

9     B     14        M

10    B     15        M

11    B     16        M

12    B     17        M

13    B     18        M

14    A      8        P

15    A      9        P

16    A     10        P

17    A     11        P

18    A     12        P

19    A     13        P

20    A     14        P

21    B     18        P

22    B     19        P

23    B     20        P

24    B     21        P

25    B     22        P

26    B     23        P

27    B     24        P


查看完整回答
反对 回复 2021-06-08
?
莫回无

TA贡献1865条经验 获得超7个赞

解决方案

这是一种比 user3483203 建议的更讨人喜欢的方法。这避免了不必要的迭代,速度更快(对于足够大的数据集),并且更符合习惯。


m = {'A':[1,2,3,4,5,6,7],

     'B':[12,13,14,15,16,17,18]}


p = {'A':[8,9,10,11,12,13,14],

     'B':[18,19,20,21,22,23,24]}



p_df = pd.DataFrame(p).melt(value_name='value')

m_df = pd.DataFrame(m).melt(value_name='value')


p_df['category'] = 'P'

m_df['category'] = 'M'


result = pd.concat([m_df, p_df], ignore_index=True)

基准(对于更大的数据集):

m = {'A': list(range(0, 100_000)), 'B': list(range(100_000, 200_000))}

p = {'A': list(range(200_000, 300_000)), 'B': list(range(300_000, 400_000))}

开始了:


%%timeit

p_df = pd.DataFrame(p).melt(value_name='value')

m_df = pd.DataFrame(m).melt(value_name='value')


p_df['category'] = 'P'

m_df['category'] = 'M'


result = pd.concat([m_df, p_df], ignore_index=True)

每个循环 120 ms ± 3.16 ms(7 次运行的平均值 ± 标准偏差,每次 10 次循环)


%%timeit

categories = ['M', 'P']

dcts = [m, p]

dfs = [

    pd.DataFrame([[k, el, cat] for k, v in dct.items() for el in v])

    for dct, cat in zip(dcts, categories)

]


cols = {'columns': {0: 'Name', 1: 'Value', 2: 'Category'}}

result = pd.concat(dfs).reset_index(drop=True).rename(**cols)

每个循环 207 ms ± 8.9 ms(7 次运行的平均值 ± 标准偏差,每次 1 次循环)


查看完整回答
反对 回复 2021-06-08
  • 2 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号