繁体   English   中英

使用 lambda function 创建字典时 Pandas 0.20 和 0.24 中的不同行为

[英]Different behaviour in Pandas 0.20 and 0.24 while creating a dictionary using lambda function

我正在使用 2.7.13 并观察 2 个版本的 pandas 之间的不同行为。

import pandas as pd
df = pd.DataFrame({'cluster': ['5', '5', '5', '5', '5', '5'],
         'mdse_item_i': ['23627102',
                         '23627102',
                         '23627102',
                         '23627102',
                         '23627102',
                         '23627102'],
         'predPriceQty': ['35.675543',
                         '35.675543',
                         '35.675543',
                         '35.675543',
                         '35.675543',
                         '35.675543'],
         'schedule_i': ['56', '56', '56', '56', '56', '56'],
         'segment_id': ['4123', '4123', '4144', '4161', '4295', '4454'],
         'wk': ['1', '1', '1', '1', '1', '1']} )
df.set_index(['segment_id', 'cluster'], inplace=True)

df.apply(lambda row:
                 {row['schedule_i']: {row['mdse_item_i']: {row['wk']: row['predPriceQty']}}},
                 axis=1)

下面是使用不同版本的 pandas 的结果

Pandas:0.24.2

segment_id  cluster
4123        5          {u'56': {u'23627102': {u'1': u'35.675543'}}}
            5          {u'56': {u'23627102': {u'1': u'35.675543'}}}
4144        5          {u'56': {u'23627102': {u'1': u'35.675543'}}}
4161        5          {u'56': {u'23627102': {u'1': u'35.675543'}}}
4295        5          {u'56': {u'23627102': {u'1': u'35.675543'}}}
4454        5          {u'56': {u'23627102': {u'1': u'35.675543'}}}
dtype: object

Pandas:0.20.1

                    mdse_item_i  predPriceQty  schedule_i  wk
segment_id cluster
4123       5                NaN           NaN         NaN NaN
           5                NaN           NaN         NaN NaN
4144       5                NaN           NaN         NaN NaN
4161       5                NaN           NaN         NaN NaN
4295       5                NaN           NaN         NaN NaN
4454       5                NaN           NaN         NaN NaN

我不确定为什么要为 Nan 创造价值,我将不胜感激这方面的任何帮助

最终我的目标是使用 to_dict() 创建一个字典,如下所示..我想避免在行之间迭代,因为我的数据集有超过 100k 行

df.apply(lambda row:
                 {row['schedule_i']: {row['mdse_item_i']: {row['wk']: row['predPriceQty']}}},
                 axis=1).to_dict()

我也想使用 pandas 到 0.20 来实现这一点,因为由于某些限制,我无法升级到 pandas 0.24

您可以只使用to_dict然后使用字典理解:

di = df[~df.index.duplicated(keep='first')].to_dict(orient='index')
{k:{v['schedule_i']: {v['mdse_item_i']: {v['wk']: v['predPriceQty']}}}
     for k,v in di.items()}

# Output:
{('4123', '5'): {'56': {'23627102': {'1': '35.675543'}}},
 ('4144', '5'): {'56': {'23627102': {'1': '35.675543'}}},
 ('4161', '5'): {'56': {'23627102': {'1': '35.675543'}}},
 ('4295', '5'): {'56': {'23627102': {'1': '35.675543'}}},
 ('4454', '5'): {'56': {'23627102': {'1': '35.675543'}}}}

可以肯定的是,即使使用 Pandas 0.2 也能正常工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM