为什么从数据框中检索单行作为字典而不是作为系列?

时间:2019-12-25 07:34:59

标签: python pandas dataframe

考虑以下代码:

import pandas as pd

activities = {
    'id': ['34343', '11', '1234'],
    'map': [
        {'id': 5743, 'summary_polyline': 343434},
        {'id': 95},
        {'id': 86},
    ]
}

df = pd.DataFrame(activities)
has_polyline = df['map'].map(lambda x: True if x.get('summary_polyline') else False)
df = df.set_index(has_polyline) 
df = df.loc[True]

print(df['map'])

打印的是一本字典:

{'id': 5743, 'summary_polyline': 343434}

但是如果有多于两行的折线在其中:

    import pandas as pd

    activities = {
        'id': ['34343', '11', '1234'],
        'map': [
            {'id': 5743, 'summary_polyline': 343434},
            {'id': 95, 'summary_polyline': 111}, # second True row
            {'id': 86},
        ]
    }

    df = pd.DataFrame(activities)
    has_polyline = df['map'].map(lambda x: True if x.get('summary_polyline') else False)
    df = df.set_index(has_polyline) 
    df = df.loc[True]

    print(df['map'])

一个Series对象将被打印:

 map
    True    {'id': 5743, 'summary_polyline': 343434}
    True         {'id': 95, 'summary_polyline': 111}
    Name: map, dtype: object

为什么会这样?即使只有Series行,我怎么能总是获得True?我需要一致的输出,因为我事先不知道会有多少True行。

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,则当您使用索引来指示是否有行has_polyline时,您的问题就会开始。 当您按索引查找时,大熊猫会假设您正在查找特定的行,因此它将以一系列形式单独返回该行。查找特定列现在将为您提供该单元格中的对象。 如果多个行具有相同的索引,则熊猫别无选择,只能将它们全部返回,因此现在查找一列将为您提供一系列。

您可以使用以下语法来避免这种现象:

import pandas as pd

activities = {
    'id': ['34343', '11', '1234'],
    'map': [
        {'id': 5743, 'summary_polyline': 343434},
        {'id': 95},
        {'id': 86},
    ]
}

df = pd.DataFrame(activities)
has_polyline = df['map'].map(lambda x: True if x.get('summary_polyline') else False)
print(df[has_polyline]['map'])

在这里,您是在告诉熊猫“获取has_polyline为True的所有行,然后将得到的df的'map'列给我。