Python 使用循环从数据帧中删除行

Python 使用循环从数据帧中删除行,python,pandas,Python,Pandas,我有一个世界上每个国家的环境数据框架。我想删除不代表单个国家的任何国家条目,如“非洲”或“世界”。我列出了这些价值观。我试图循环遍历df,并删除列表中country=a值的每一行。没有那么多问题条目,我以前用.loc删除过它们,但我不确定为什么这个函数不起作用。我得到一个错误:keyrerror:'[(一组数字)]未在轴' not_country = ['Africa', 'Asia', 'Asia (excl. China & India)','EU-27','EU-28', 'Eur

我有一个世界上每个国家的环境数据框架。我想删除不代表单个国家的任何国家条目,如“非洲”或“世界”。我列出了这些价值观。我试图循环遍历df,并删除列表中country=a值的每一行。没有那么多问题条目,我以前用.loc删除过它们,但我不确定为什么这个函数不起作用。我得到一个错误:keyrerror:'[(一组数字)]未在轴'

not_country = ['Africa', 'Asia', 'Asia (excl. China & India)','EU-27','EU-28', 'Europe','Europe (excl. EU-27)',
               'Europe (excl. EU-28)', 'International transport', 'Kuwaiti Oil Fires', 'North America',
               'North America (excl. USA)', 'World', 'South America']

def clean_countries(df, lst):
    index_names = []

    for country_name in lst:
        index_names.append(df[df['country'] == country_name].index)

        for i in df:
            df.drop(index_names, inplace = True)

clean_co2_df = clean_countries(co2_df, not_country) ```

数据帧的优点之一是,您很少需要通过迭代来完成工作。通常有更有效的方法。下面是一个使用世界人口数据的示例数据框来解决您的问题的解决方案

not_country = ['Africa', 'Asia', 'Asia (excl. China & India)','EU-27','EU-28', 'Europe','Europe (excl. EU-27)',
               'Europe (excl. EU-28)', 'International transport', 'Kuwaiti Oil Fires', 'North America',
               'North America (excl. USA)', 'World', 'South America']
pop_data = {'Country': {0: 'China', 1: 'India', 2: 'USA', 3: 'Asia'}, 'Population': {0: 1439000000, 1: 1380004385, 2: 331002651, 3: 4641054775}, 'Yearly Change %': {0: 0.39, 1: 0.99, 2: 0.59, 3: 0.86}}

df = pd.DataFrame(pop_data)
print(f'BEFORE: \n {df}')

df = df.loc[df['Country'].apply(lambda x: x not in not_country)]
print(f'AFTER: \n {df}')

#output:
BEFORE: 
   Country  Population  Yearly Change %
0   China  1439000000             0.39
1   India  1380004385             0.99
2     USA   331002651             0.59
3    Asia  4641054775             0.86
AFTER: 
   Country  Population  Yearly Change %
0   China  1439000000             0.39
1   India  1380004385             0.99
2     USA   331002651             0.59

您很少需要或甚至不想在数据结构中循环
df=df.loc[~df['Country'].isin(非_Country)]
dataframe的优点之一是,您很少需要遍历它来完成工作。还有更有效的方法。发布dayaframe的前几行,以便我们向您展示如何使用。使用
apply
相当于在数据帧上迭代。Paul H在问题的评论中建议的方法在这种情况下是正确的。@jivan apply比iterrows快得多,因为它在Python中使用C扩展:。它们不是等价的。python仍然需要每次计算lambda,而在使用
~df['Country']时则不是这样。isin(not_Country)
@pakpe谢谢@吉万。我同意Paul H的建议更有效,但我的.apply()解决方案是有效的,而且比在数据帧上迭代要有效得多。它不值得一票否决。