为什么从DataFrame中检索一行时,它会以字典而不是Series的形式返回?

5

请考虑以下代码:

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
如果我正确理解了您的问题,那么当您使用索引来指示一行是否具有多段线时,您的问题就开始了。 当您按索引查找时,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'])

在这里,你告诉pandas:“取出所有has_polyline为True的行,并给我df中的'map'列。”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接