![](/img/trans.png)
[英]Replace values from one column by comparing another column to a second DataFrame
[英]Comparing values in one column to values in a column in a second dataframe
我有2个dataframes
,每个dataframe
都有一个RegionName
列。 我想创建一个将具有值“真”的新列,如果RegionName
在dataframe
A中出现RegionName
在dataframe
B.
我编写了一个lambda函数,尝试执行此操作但对我的dataframe
所有项都返回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()
housing['University City'] = np.where(housing['RegionName'] == university['RegionName'](axis=1),'true','false')
熊猫系列具有类似字典的属性。 考虑以下:
s = pd.Series(['a', 'b', 'c', 'd'], index=[10, 11, 12, 13])
'a' in s # False
10 in s # True
所以你实际上是检查系列索引中的存在而不是系列值 。 另外, apply
+ lambda
是一个低效的Python级循环。
使用Pandas,您应该查看向量化操作,例如通过pd.Series.isin
,它隐式使用值。 此外,首先让您的比较系列独一无二:
unique_vals = university['RegionName'].unique()
housing['University City'] = housing['RegionName'].isin(unique_vals)
这会创建一个布尔系列。 如果0
/ 1
是一个要求,你就可以转换为int
:
housing['University City'] = housing['University City'].astype(int)
使用isin
进行比较,通过布尔掩码的另一个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)
另一个解决方案是使用numpy.where
如果想通过mask创建新值,那么更好的是:
housing['University City'] = np.where(mask, 'match', 'no match')
请尝试同伴代码,我作为教程为你做;)
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.