pandas 覆盖现有列并根据不同条件将值提取到新列

7lrncoxx  于 2022-11-20  发布在  其他
关注(0)|答案(1)|浏览(136)

我有这个系列,其中包含国家,州,城市,我想提取他们相应-参考输出表
| 地区名称|
| - -|
| 美国 |
| 亚利桑那州
*|
| Phoenix|
| 梅萨|
| 加州**|
| 洛杉矶|
| 圣地牙哥|
| 萨克拉门托|
| 佛罗里达州**|
| 坦帕|
| 迈阿密|
| 加拿大 |
| 加拿大中部
*|
| 蒙特娄|
| 伦敦|
我想要的输出
| 地区名称|州/省||城市名称|
| - -|- -|- -|- -|
| 美国 | 亚利桑那州*| |Phoenix|
| 美国 | 亚利桑那州*| |梅萨|
| 美国 | 加州*| |洛杉矶|
| 美国 | 加州*| |圣地牙哥|
| 美国 | 加州*| |萨克拉门托|
| 美国 | 佛罗里达州*| |坦帕|
| 美国 | 佛罗里达州*| |迈阿密|
| 加拿大 | 加拿大中部*| |蒙特娄|
| 加拿大 | 加拿大中部*| |伦敦|
这可能吗?
我用isin()尝试了一些panda操作,但失败得很惨。

ca1c2owp

ca1c2owp1#

当然有可能:

def split_by_country(region_list: pd.Series):
    result = []
    start_idx = None
    for i, region in enumerate(region_list):
        if region.endswith("*") and not region.endswith("**"):
            if start_idx is None:
                start_idx = i
            elif isinstance(start_idx, int):
                result.append(region_list[start_idx: i])
                start_idx = i
    result.append(region_list[start_idx:])
    return result
        
countries = split_by_country(regions_s) 
countries

上面的代码将把区域的序列/列表拆分成列表的列表。每个子列表都以国家名称开始(索引0)。然后你可以这样做:

country_dict = {country[0]: split_by_region(country[1:])
                for country in countries}

split_by_region与split_by_country by相同,但条件不同(region.endswith("*") and not region.endswith("**")region.endswith("**")
最后是(下面的代码我写的时候没有检查,所以可能包含一些语法错误):

result_df = pd.DataFrame(columns=["country","subregion","city"])
for i, (country, subregions) in enumerate(country_dict.iteritems()):
    for subregion, city in subregions.iteritems():
        result_df.loc[i] = [country, subregion, city]

相关问题