【问题标题】:Pandas dataframe to multikey dictionary熊猫数据框到多键字典
【发布时间】:2021-10-26 09:22:55
【问题描述】:

我正在尝试将这样的 df 转换为具有多个嵌套键的字典。

import pandas as pd
import datetime

columns = ['country', 'city', 'from_date', 'to_date', 'sales']
data = [['UK', 'London', datetime.date(2021, 8, 26), datetime.date(2099, 5,5), 2500], ['Mexico', 'Mexico City', datetime.date(2011, 3,3), datetime.date(2012, 4, 5), 5670], ['Mexico', 'Mexico City', datetime.date(2014, 3,3), datetime.date(2017, 4, 5), 5680]]
df = pd.DataFrame(data, columns=columns)
df
  country         city from_date     to_date  sales
0      UK       London 2021-08-26  2099-05-05   2500
1  Mexico  Mexico City 2011-03-03  2012-04-05   5670
2  Mexico  Mexico City 2014-03-03  2017-04-05   5680

我正在寻找的结果 #1:

{'Mexico': 
   {'Mexico City':
      [
         {'from_date: 2011-03-03, 'to_date:  2012-04-05, 'sales': 5670},
         {'from_date: 2014-03-03, 'to_date:  2017-04-05, 'sales': 5680}
      ]},
'UK': 
     {'London':
       [
         {'from_date: 2021-08-26, 'to_date:  2099-05-05, 'sales': 2500}
      ]},
}

或结果 #2:

{'Mexico': 
   {'Mexico City':
      {2011-03-03: 5670,  # from_date: sales
      2014-03-03: 5680}   # from_date: sales
   },
'UK': 
     {'London':
       {2021-08-26: 2500}   # from_date: sales
      },
}

我不知道如何得到结果#1,至于结果#2我试过这个:

df.groupby(['country', 'city', 'from_date'])['sales'].apply(float).to_dict()
{('Mexico', 'Mexico City', Timestamp('2011-03-03 00:00:00')): 5670.0, ('Mexico', 'Mexico City', Timestamp('2014-03-03 00:00:00')): 5670.0, ('UK', 'London', Timestamp('2021-08-26 00:00:00')): 2500.0}

但我需要能够将from_date 作为单独的密钥,因为我将使用它与另一个日期进行比较。 理想情况下,我想学习如何获得这两个结果,但我们不胜感激!

【问题讨论】:

  • 您的示例代码缺少 import datetime 并且不确定 import dataframe 是什么?
  • “结果#2”的结构在第一步中似乎是不可能的。如果您想拥有多个没有键的字典,则必须将它们放在一个数组中:[{2011-03-03: 5670}, {2014-03-03: 5680}]; {2011-03-03: 5670} 格式的最里面的字典似乎是对字典的滥用。不过,“结果 #1”似乎可行。
  • @JonClements 这是一个简单的错字 - 已修复为导入日期时间 :)
  • @Haroldo_OK 你是对的 - 我把它们当作 dict。

标签: python pandas dataframe dictionary


【解决方案1】:

您可以在GroupBy.applyDataFrame.to_dict 中通过lambda 函数创建MultiIndex Series

df['from_date'] = pd.to_datetime(df['from_date']).dt.strftime('%Y-%m-%d')
df['to_date'] = pd.to_datetime(df['to_date']).dt.strftime('%Y-%m-%d')

f = lambda x: x.to_dict('records')
s = df.groupby(['country', 'city'])[['from_date','to_date','sales']].apply(f)


d = {level: s.xs(level).to_dict() for level in s.index.levels[0]}
print (d)

{
    'Mexico': {
        'Mexico City': [{
                'from_date': '2011-03-03',
                'to_date': '2012-04-05',
                'sales': 5670
            },
            {
                'from_date': '2014-03-03',
                'to_date': '2017-04-05',
                'sales': 5680
            }
        ]
    },
    'UK': {
        'London': [{
            'from_date': '2021-08-26',
            'to_date': '2099-05-05',
            'sales': 2500
        }]
    }
}

第二个只改变了 lambda 函数:

f = lambda x: x.set_index('from_date')['sales'].to_dict()
s2 = df.groupby(['country', 'city']).apply(f)
print (s2)
country  city       
Mexico   Mexico City    {'2011-03-03': 5670, '2014-03-03': 5680}
UK       London                             {'2021-08-26': 2500}
dtype: object

d2 = {level: s2.xs(level).to_dict() for level in s2.index.levels[0]}
print (d2)
{'Mexico': {'Mexico City': {'2011-03-03': 5670, '2014-03-03': 5680}}, 
 'UK': {'London': {'2021-08-26': 2500}}}

【讨论】:

  • 非常感谢@jezrael!这正是我想要的!
  • 我只是在玩:{k[0]: {k[1]: g.loc[:, 'from_date':].to_dict('records')} for k, g in df.groupby(['country', 'city'])}:p
猜你喜欢
  • 2016-10-17
  • 2017-08-02
  • 2017-02-27
  • 2017-12-03
  • 2020-07-23
  • 1970-01-01
  • 2021-07-17
  • 2017-09-10
  • 1970-01-01
相关资源
最近更新 更多