Сравнение значений в одном столбце со значениями в столбце во втором фрейме данных - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть 2 dataframes, каждый из dataframe имеет столбец RegionName.Я хотел бы создать новый столбец, который будет иметь значение 'true', если RegionName в dataframe A появится под RegionName в dataframe B.

Я написал лямбда-функцию, котораяпытается сделать это, но возвращает false для всех элементов в моем dataframe (что не так).Я также пытался использовать 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')

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Ряды Панд имеют словарные свойства.Рассмотрим следующее:

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

'a' in s  # False
10 in s   # True

Таким образом, вы фактически проверяете наличие в серии index , а не в серии values ​​.Кроме того, 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)
0 голосов
/ 14 декабря 2018

, пожалуйста, попробуйте код для общения, я сделаю его для вас в качестве учебника;)

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()
0 голосов
/ 14 декабря 2018

Используйте 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 что лучше, если вы хотите создать новые значения по маске:

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