Python pandas从列表中的dict中提取值

时间:2016-02-26 14:53:52

标签: python python-2.7 python-3.x pandas

基本上我想从这一列中提取价格值,但问题是如果我使用index [0]它会在第11行引入index [0]错误,而price key也不会在此行中退出。

ex
0    {u'availableToBack': [{u 'price' : 1.02, u 'size' : 2.15}], u 'availableToLay' : [], u 'tradedVolume' : []}
1    {u'availableToBack': [{u'price': 6.8, u'size':...
2    {u'availableToBack': [{u'price': 8.2, u'size':...
3    {u'availableToBack': [{u'price': 9.6, u'size':...
10   {u'availableToBack': [{u'price': 70.0, u'size'...
11   {u'availableToBack': [], u'availableToLay': []...
12   {u'availableToBack': [], u'availableToLay': []...

我使用类似的东西

table['price'] = table['ex']['availableToBack'][0].apply(lambda x: x.get('price'))

你能帮我解决一下吗?

JSON看起来像这样:

    u 'runners' : [{
            u 'status' : u 'ACTIVE',
            u 'handicap' : 0.0,
            u 'selectionId' : 10861647,
            u 'totalMatched' : 0.0,
            u 'adjustmentFactor' : 16.631,
            u 'ex' : {
                u 'availableToBack' : [{
                        u 'price' : 1.02,
                        u 'size' : 2.15
                    }
                ],
                u 'availableToLay' : [],
                u 'tradedVolume' : []
            }
        }, {
            u 'status' : u 'ACTIVE',
            u 'handicap' : 0.0,
            u 'selectionId' : 10861648,
            u 'totalMatched' : 0.0,
            u 'adjustmentFactor' : 13.237,
            u 'ex' : {
                u 'availableToBack' : [{
                        u 'price' : 1.01,
                        u 'size' : 7.11
                    }
                ],
                u 'availableToLay' : [],
                u 'tradedVolume' : []
            }
        },

4 个答案:

答案 0 :(得分:0)

10   {u'availableToBack': [{u'price': 70.0, u'size'...
11   {u'availableToBack': [], u'availableToLay': []...

我刚看到你的availableToBack条目包含一个空列表。如果列表值为空,则进行测试,将其设置为[dict()]。这将允许x.get('price', 0)正常工作。然后,您将能够在代码的其余部分中将'price'的值处理为0。

然后您将不必测试'无'。

x.get('price')没有指定“默认”值,因此返回“None”。设置默认值(例如x.get('price', 0))这样您应该能够以0价格执行操作。

Python dictionary get() Method

  

描述

     

方法get()返回给定键的值。如果没有钥匙   可用然后返回默认值无。语法

     

以下是get()方法的语法 -

     

dict.get(key,default = None)

     

参数

key -- This is the Key to be searched in the dictionary.

default -- This is the Value to be returned in case key does not exist.
     

返回值

     

此方法返回给定键的值。如果密钥不可用,   然后它返回默认值None。

答案 1 :(得分:0)

我不认为Python有一个安全的内置方法,可以在不触发IndexError的情况下从列表中获取值,但是编写一个很容易。 (This answer有更多细节。)

如果我理解你的意图,这可能对你有帮助。 (请注意,这仅解决了安全获取列表项的问题。您可能希望对要检索的每个字典值使用.get以提高安全性。)

def safeget(seq, index, default=None):
    try:
        return seq[index]
    except IndexError:
        return default

for table in runners:
    price = safeget(table['ex']['availableToBack'], 0, default={}).get('price')
    print price

我测试了这个结构,它在第二个对象中有一个u'availableToBack的空列表。

runners = [
    {
        u'status' : u'ACTIVE',
        u'handicap' : 0.0,
        u'selectionId' : 10861647,
        u'totalMatched' : 0.0,
        u'adjustmentFactor' : 16.631,
        u'ex' : {
            u'availableToBack' : [
                    {u'price' : 1.02, u'size' : 2.15},
                ],
            u'availableToLay' : [],
            u'tradedVolume' : []
            }
    }, {
        u'status' : u'ACTIVE',
        u'handicap' : 0.0,
        u'selectionId' : 10861648,
        u'totalMatched' : 0.0,
        u'adjustmentFactor' : 13.237,
        u'ex' : {
            u'availableToBack' : [
                ## this one is MISSING a price
            ],
            u'availableToLay' : [],
            u'tradedVolume' : []
        }
    }
]

答案 2 :(得分:0)

您可以使用三元运算符。空列表的计算结果为false。

<xcdg:DataCell FieldName=".">
 <xcdg:DataCell.Template>
   <ControlTemplate> 
     // your template code. here the event of my controls are working.
   </ControlTemplate>
 </xcdg:DataCell.Template>
</xcdg:DataCell>

答案 3 :(得分:0)

我找到了解决方案并决定发布。基本上也许我没有解释清楚,但问题是列表中有任何内容的不一致。

table['availableToBack.price'] = table['ex'].apply(lambda x: x['availableToBack'][0].get('price') if (len(x['availableToBack']) != 0) else None)