Python 将一列中的值与第二个数据帧中一列中的值进行比较

Python 将一列中的值与第二个数据帧中一列中的值进行比较,python,python-3.x,pandas,series,data-analysis,Python,Python 3.x,Pandas,Series,Data Analysis,我有2个dataframe,每个dataframe都有一个RegionName列。如果dataframea中的RegionName出现在dataframe中的RegionName下,我想创建一个值为“true”的新列 我编写了一个lambda函数,该函数尝试执行此操作,但对我的数据帧中的所有项返回false(事实并非如此)。我还尝试使用np.where(),但没有效果 housing = convert_housing_data_to_quarters() housing = housing.i

我有2个
dataframe
,每个
dataframe
都有一个
RegionName
列。如果
dataframe
a中的
RegionName
出现在
dataframe中的
RegionName
下,我想创建一个值为“true”的新列

我编写了一个lambda函数,该函数尝试执行此操作,但对我的
数据帧中的所有项返回false(事实并非如此)。我还尝试使用
np.where()
,但没有效果

housing = convert_housing_data_to_quarters()
housing = housing.iloc[:,[34,35,36,37]]
university = get_list_of_university_towns()
housing = housing.reset_index()
housing['University City'] = housing.apply(lambda x: x['RegionName'] in university['RegionName'], axis=1)
这是我尝试使用
np.where()

用于通过布尔掩码的另一个
DataFrame
列的多个值进行比较:

mask = housing['RegionName'].isin(university['RegionName'])
housing['University City'] = mask
#if need True, False to 1,0 mapping
#housing['University City'] = mask.astype(int)
另一种解决方案是,如果希望通过掩码创建新值,请使用更好的方法:

housing['University City'] = np.where(mask, 'match', 'no match')

熊猫系列具有类似字典的属性。考虑以下事项:

s = pd.Series(['a', 'b', 'c', 'd'], index=[10, 11, 12, 13])

'a' in s  # False
10 in s   # True
因此,您实际上是在检查序列索引中是否存在,而不是序列值中是否存在。此外,
apply
+
lambda
是一个低效的Python级循环

对于Pandas,您应该查看矢量化操作,例如via,它隐式使用值。此外,首先让您的比较系列独一无二可能会很有效:

unique_vals = university['RegionName'].unique()
housing['University City'] = housing['RegionName'].isin(unique_vals)
这将创建一个布尔级数。如果要求
0
/
1
,则可以转换为
int

housing['University City'] = housing['University City'].astype(int)

请尝试下面的代码,我为您制作了一个教程;)

housing['University City'] = housing['University City'].astype(int)
import pandas as pd
import numpy as np

region_names = ["region_a", "region_b", "region_c", "region_d", "region_e", 
"region_f", "region_g", "region_h"]

# Generate 100 random university names
univ_names = ["univ-%s"%i for i in range(100)]

# Select 100 random university regions from region_names
univ_regions = [region_name[np.random.randint(low=0, high=len(region_names))] for i     
in range(len(univ_names))]

# make a universities DataFrame >> DataFrame1
universities = pd.DataFrame(data=list(zip(univ_names, univ_regions)), columns=    
["univ_name", "univ_region"])

# Now, you select the half number of regions, to make comparaison >> DataFrame2
regions =pd.DataFrame(data=[region_names[np.random.randint(low=0,     
high=len(region_names))] for i in range(len(region_names) // 2)], columns= 
["region_name"])

# get unique list of region name from DataFrame2
unique_regions = regions["region_name"].unique()

# Create the third column in DataFrame1 >> bool column
universities["isin_unique_regions"] = universities.univ_region.isin(unique_regions)
universities.head()