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

bar*_*icz 5 python dataframe pandas

考虑以下代码:

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'])
Run Code Online (Sandbox Code Playgroud)

打印出来的是一本字典:

{'id': 5743, 'summary_polyline': 343434}
Run Code Online (Sandbox Code Playgroud)

但是,如果有多于两行包含折线:

    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'])
Run Code Online (Sandbox Code Playgroud)

一个Series对象将被打印:

 map
    True    {'id': 5743, 'summary_polyline': 343434}
    True         {'id': 95, 'summary_polyline': 111}
    Name: map, dtype: object
Run Code Online (Sandbox Code Playgroud)

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

sha*_*elk 0

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

您可以使用以下语法来避免此行为:

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'])
Run Code Online (Sandbox Code Playgroud)

在这里,你告诉 pandas“获取所有为 True 的行has_polyline,然后给我'map'你得到的 df 的列。