有选择地填充pandas列,具体取决于其他列中的值是否属于列表

时间:2019-02-12 11:18:58

标签: python pandas

我有一列熊猫数据框,其中一列是小地理区域的名称。我制定了一套规则,定义了这些区域中的哪些区域属于较大的区域。由于每条规则都是一个条件,因此我尝试使用np.select,但我总是遇到错误。

这是我尝试过的:

Okanagan_and_Kootenays = ['Columbia-Shuswap','Central Okanagan', 'North Okanagan', 'Okanagan-Similkameen', 'East Kootenay', 'Kootenay Boundary','Central Kootenay' ]

conditions = [(main_file['long_name'] == Okanagan_and_Kootenays)]
choices = 'Okanagan_and_Kootenays'

main_file['_area_large'] = np.select(conditions, choices)  

我每次都会收到以下错误消息:

ValueError: Arrays were different lengths: 1412 vs 7

2 个答案:

答案 0 :(得分:1)

如果我理解正确,那么您想使用.isin(),并使用np.select,您的选择应该是一个与conditions列表长度相同的可迭代(列表):

Okanagan_and_Kootenays = ['Columbia-Shuswap','Central Okanagan', 'North Okanagan',
                          'Okanagan-Similkameen', 'East Kootenay', 'Kootenay Boundary',
                          'Central Kootenay' ]

conditions = [(main_file['long_name'].isin(Okanagan_and_Kootenays))]
choices = ['Okanagan_and_Kootenays']

main_file['_area_large'] = np.select(conditions, choices)

答案 1 :(得分:0)

在这种情况下,我不确定np.select是最有效的方法。如果您有很多大区域,您打算做什么?循环真的会很慢。

您可以考虑以下方法:

import pandas as pd

dct = {"area1": ["town1", "town2", "town3"],
       "area2": ["town4", "town5", "town6", "town7"]}

df = pd.DataFrame({"town": sum([dct[k] for k,v
                                in dct.items()],
                               [])})

inv_dct = {}
for k, vs in dct.items():
    for v in vs:
        inv_dct[v] = k

df["area"] = df["town"].map(inv_dct)