Сравните два столбца данных для сопоставления в процентах - PullRequest
5 голосов
/ 17 июня 2019

Я хочу сравнить кадр данных одного столбца с другим кадром данных из нескольких столбцов и вернуть заголовок столбца с максимальным процентом совпадения.

Я не могу найти функции соответствия в пандах. Первый столбец первого кадра данных:

cars
----   
swift   
maruti   
wagonor  
hyundai  
jeep

Первый кадр данных, второй столбец:

bikes
-----
RE
Ninja
Bajaj
pulsar

кадр данных одного столбца:

words
---------
swift 
RE 
maruti
waganor
hyundai
jeep
bajaj

Желаемый вывод:

100% match  header - cars

Ответы [ 4 ]

3 голосов
/ 17 июня 2019

Попробуйте использовать isin функцию панд DataFrame. Предполагая, что df - ваш первый фрейм данных, а слова - это список:

In[1]: (df.isin(words).sum()/df.shape[0])*100
Out[1]:
cars     100.0
bikes     20.0
dtype: float64

Вам может понадобиться использовать строчные буквы в вашей df и в списке слов, чтобы избежать проблем с регистром.

1 голос
/ 17 июня 2019

Построить Series, используя numpy.in1d и ndarray.mean, затем вызвать Series.idxmax и maxметоды:

# Setup
df1 = pd.DataFrame({'cars': {0: 'swift', 1: 'maruti', 2: 'waganor', 3: 'hyundai', 4: 'jeep'}, 'bikes': {0: 'RE', 1: 'Ninja', 2: 'Bajaj', 3: 'pulsar', 4: np.nan}})
df2 = pd.DataFrame({'words': {0: 'swift', 1: 'RE', 2: 'maruti', 3: 'waganor', 4: 'hyundai', 5: 'jeep', 6: 'bajaj'}})

match_rates = pd.Series({col: np.in1d(df1[col], df2['words']).mean() for col in df1})

print('{:.0%} match header - {}'.format(match_rates.max(), match_rates.idxmax()))

[out]

100% match header - cars
1 голос
/ 17 июня 2019

Вы можете сначала получить столбцы в списки:

dfCarsList = df['cars'].tolist()
dfWordsList = df['words'].tolist()
dfBikesList = df['Bikes'].tolist()

И затем итерация списка для сравнения:

numberCars = sum(any(m in L for m in dfCarsList) for L in dfWordsList)
numberBikes = sum(any(m in L for m in dfBikesList) for L in dfWordsList)

Чем больше цифр вы можете использовать, чем для вывода.

0 голосов
/ 17 июня 2019

Вот решение с функцией, которая возвращает кортеж (column_name, match_percentage) для столбца с максимальным процентом совпадения.Он принимает в качестве аргументов кадр данных pandas (велосипеды и автомобили в вашем примере) и серию (слова).

def match(df, se):
    max_matches = 0
    max_col = None
    for col in df.columns:
        # Get the number of matches in a column
        n_matches = sum([1 for row in df[col] if row in se.unique()])
        if n_matches > max_matches:
            max_col = col
            max_matches = n_matches
    return max_col, max_matches/df.shape[0]

В вашем примере вы должны получить следующий вывод:

df = pd.DataFrame()
df['Cars'] = ['swift', 'maruti', 'wagonor', 'hyundai', 'jeep']
df['Bikes'] = ['RE', 'Ninja', 'Bajaj', 'pulsar', '']
se = pd.Series(['swift', 'RE', 'maruti', 'wagonor', 'hyundai', 'jeep', 'bajaj'])

In [1]: match(df, se)
Out[1]: ('Cars', 1.0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...