pandas isin
介绍
在数据处理的过程中,我们经常需要根据指定的条件来筛选数据。在实际应用中,我们可能需要从一个大的数据集中提取符合某些条件的数据,或者根据一组指定的值来过滤数据。在这种情况下,isin
方法可以帮助我们更快速、更方便地实现这些操作。
isin
方法是pandas
库的一个非常实用的函数,它可以用来检查一个数组或者DataFrame
对象中的值是否在另一个数组或者序列中,并返回一个布尔值序列或者一个新的DataFrame
对象。使用isin
方法可以使得数据筛选的代码更加简洁和易读。
本文将详细介绍pandas
库中的isin
方法的用法,并通过示例代码来展示其在实践中的应用。
基本用法
检查单个列中的值是否在指定的序列中
首先,我们来看一个最基本的用法。假设我们有一个包含多个国家的数据集,我们想要筛选出其中一部分特定的国家。我们可以使用isin
方法来实现这个功能。
首先,我们需要导入pandas
库,并创建一个包含国家数据的DataFrame
对象。
import pandas as pd
data = {'Country': ['China', 'United States', 'India', 'Japan', 'Germany'],
'Population': [1444216107, 331002651, 1380004385, 126476461, 83783942]}
df = pd.DataFrame(data)
print(df)
运行以上代码,我们可以得到以下输出:
Country Population
0 China 1444216107
1 United States 331002651
2 India 1380004385
3 Japan 126476461
4 Germany 83783942
接下来,我们使用isin
方法来筛选出我们感兴趣的国家,比如中国和印度。
countries_of_interest = ['China', 'India']
filtered_df = df[df['Country'].isin(countries_of_interest)]
print(filtered_df)
运行以上代码,我们可以得到以下输出:
Country Population
0 China 1444216107
2 India 1380004385
通过df['Country'].isin(countries_of_interest)
这一行代码,我们可以判断每个国家是否在countries_of_interest
序列中,生成一个布尔值序列。True
表示在序列中,False
表示不在序列中。然后,我们可以使用这个布尔值序列来筛选出相应的行。
检查多个列的多个值是否在指定的序列中
除了检查单个列的值,isin
方法还可以用于多个列的值。我们可以传递一个字典给isin
方法,字典的键是列名,键的值是我们感兴趣的值。
下面的示例代码演示了如何使用isin
方法来筛选出多个列的多个值。
data = {'Country': ['China', 'United States', 'India', 'Japan', 'Germany'],
'Continent': ['Asia', 'North America', 'Asia', 'Asia', 'Europe'],
'Population': [1444216107, 331002651, 1380004385, 1, 83783942]}
df = pd.DataFrame(data)
print(df)
运行以上代码,我们可以得到以下输出:
Country Continent Population
0 China Asia 1444216107
1 United States North America 331002651
2 India Asia 1380004385
3 Japan Asia 1
4 Germany Europe 83783942
我们想要筛选出亚洲国家的数据,可以使用以下代码:
countries_of_interest = {'Country': ['China', 'India'], 'Continent': ['Asia']}
filtered_df = df[df.isin(countries_of_interest)]
print(filtered_df)
运行以上代码,我们可以得到以下输出:
Country Continent Population
0 China Asia 1444216107
1 NaN NaN NaN
2 India Asia 1380004385
3 NaN NaN NaN
4 NaN NaN NaN
在新的DataFrame
对象中,只有符合我们指定的条件的列会被保留下来,其他列的值则被替换为NaN
。
使用~
反转isin
方法的结果
isin
方法返回了一个布尔值序列或者一个新的DataFrame
对象,其中True
表示值在指定的序列中,False
表示值不在序列中。如果我们想要选取不在指定序列中的值,可以使用tilda (~)
将筛选条件取反。
以下是一个示例代码:
data = {'Country': ['China', 'United States', 'India', 'Japan', 'Germany'],
'Continent': ['Asia', 'North America', 'Asia', 'Asia', 'Europe'],
'Population': [1444216107, 331002651, 1380004385, 1, 83783942]}
df = pd.DataFrame(data)
print(df)
运行以上代码,我们可以得到以下输出:
Country Continent Population
0 China Asia 1444216107
1 United States North America 331002651
2 India Asia 1380004385
3 Japan Asia 1
4 Germany Europe 83783942
我们想要筛选出不属于亚洲的国家的数据,可以使用以下代码:
countries_of_interest = {'Country': ['China', 'India'], 'Continent': ['Asia']}
filtered_df = df[~df.isin(countries_of_interest)]
print(filtered_df)
运行以上代码,我们可以得到以下输出:
Country Continent Population
0 China NaN NaN
1 United States North America 331002651
2 NaN NaN NaN
3 Japan NaN NaN
4 Germany Europe 83783942
通过在df
前面加上tilda (~)
运算符,我们实现了取反的操作,即选取不在指定序列中的值。
使用|
和&
组合多个isin
条件
isin
方法还支持使用|
和&
运算符来组合多个条件,用于更复杂的数据筛选。
以下是一个示例代码:
data = {'Country': ['China', 'United States', 'India', 'Japan', 'Germany'],
'Continent': ['Asia', 'North America', 'Asia', 'Asia', 'Europe'],
'Population': [1444216107, 331002651, 1380004385, 1, 83783942]}
df = pd.DataFrame(data)
print(df)
运行以上代码,我们可以得到以下输出:
Country Continent Population
0 China Asia 1444216107
1 United States North America 331002651
2 India Asia 1380004385
3 Japan Asia 1
4 Germany Europe 83783942
现在,我们想要筛选出亚洲的国家以及人口超过1亿的国家。我们可以使用以下代码:
filtered_df = df[df['Continent'].isin(['Asia']) & (df['Population'] > 100000000)]
print(filtered_df)
运行以上代码,我们可以得到以下输出:
Country Continent Population
0 China Asia 1444216107
2 India Asia 1380004385
通过使用&
运算符,我们可以将两个条件进行组合,并将满足条件的行筛选出来。在这个示例中,我们用df['Continent'].isin(['Asia'])
来筛选出亚洲的国家,然后再通过(df['Population'] > 100000000)
筛选出人口超过1亿的国家。最终,我们得到了亚洲国家中人口超过1亿的国家。
使用np.nan
表示缺失数据
在刚才的示例中,我们可以看到在筛选结果中存在一些值为NaN
的情况。这是因为我们使用isin
方法筛选时,未在指定的序列中的值会被替换为NaN
。
在pandas
中,NaN
表示缺失数据。当筛选条件不满足时,DataFrame
对象中相应的值会变为NaN
。我们可以使用notna()
方法来检查数据是否不为NaN
。
以下是一个示例代码:
data = {'Country': ['China', 'United States', 'India', 'Japan', 'Germany'],
'Continent': ['Asia', 'North America', 'Asia', 'Asia', 'Europe'],
'Population': [1444216107, 331002651, 1380004385, np.nan, 83783942]}
df = pd.DataFrame(data)
print(df)
运行以上代码,我们可以得到以下输出:
Country Continent Population
0 China Asia 1.444216e+09
1 United States North America 3.310027e+08
2 India Asia 1.380004e+09
3 Japan Asia NaN
4 Germany Europe 8.378394e+07
我们可以使用notna()
方法来检查Population
列中是否存在缺失数据:
filtered_df = df[df['Population'].notna()]
print(filtered_df)
运行以上代码,我们可以得到以下输出:
Country Continent Population
0 China Asia 1.444216e+09
1 United States North America 3.310027e+08
2 India Asia 1.380004e+09
4 Germany Europe 8.378394e+07
通过使用notna()
方法,我们筛选出了不包含缺失数据的行。
总结
isin
方法是pandas
库中一个非常实用的函数,可以用于快速、方便地筛选数据。我们可以使用isin
方法来检查一个数组或者DataFrame
对象中的值是否在另一个数组或者序列中,并返回一个布尔值序列或者一个新的DataFrame
对象。
在本文中,我们详细介绍了isin
方法的基本用法,包括检查单个列中的值是否在指定的序列中、检查多个列的多个值是否在指定的序列中、使用~
反转isin
方法的结果以及使用|
和&
组合多个isin
条件。我们还介绍了如何处理缺失数据。
使用isin
方法可以大大简化数据筛选的代码,使得我们能够更加高效地处理数据。