首页 > 解决方案 > 如何让 pandas str.contains() 正确选择带有“Virginia”和“West Virginia”的行?

问题描述

我正在尝试解析包含状态列的 csv。我想从一个聚合的 csv 中为每个单独的状态制作一个 csv。该代码为“Virginia”和“West Virginia”创建了一个数据框,但问题是“Virginia”df 还包含所有“West Virginia”行。有想法该怎么解决这个吗?通过设置 regex=False,我能够解决与“Arkansas”和“Kansas”相同的问题。

df = pd.read_csv(io.StringIO(stat.decode('utf-8')))

states = parse(df, 'state')

write_states(df, states)

def parse(df, suffix):
    df = df.sort_values(by=[suffix])
    df = df[suffix]
    df = df.drop_duplicates()
    df = [df for df in df]
    return df

def write_states(df, states):
    mk_dir('states')
    print(f"writing to '{os.path.join(os.getcwd(), 'states')}'")
    d = df
    s = tqdm(states, ncols=103, leave=False, ascii=' #')
    for state in s:
        s.set_description(state)
        df = d[d['state'].str.contains(state, regex=False)]
        dates = np.array(df['date'], dtype='datetime64')
        states = np.array(df['state'])
        total_cases = np.array(df['cases'], dtype='int64')
        total_deaths = np.array(df['deaths'], dtype='int64')
        new_cases = get_diff(total_cases)
        new_deaths = get_diff(total_deaths)
        df = pd.DataFrame({'date': dates, 'state': states, 'total cases': total_cases, 
            'total deaths': total_deaths, 'new cases': new_cases, 'new deaths': new_deaths})
        df.to_csv(f"states/{state}.csv", index=False)

标签: pythonpython-3.xpandasnumpy

解决方案


添加^$到正则表达式怎么样?这应该可以处理诸如 West/Virginia、Ar/kansas 等的歧义。

df = d[d['state'].str.contains(f'^{state}$', case=False)]

推荐阅读