Найти корреспондентов в фреймах данных для расчета - PullRequest
0 голосов
/ 16 января 2019

Два кадра данных, как показано ниже, и я хочу рассчитать коэффициент корреляции.

Работает нормально, когда оба столбца заполнены фактическими значениями. Но когда это не так, он принимает значение ноль в качестве значения при расчете коэффициента корреляции.

Например, веса Аддисона и Кадена равны 0. Джек и Ноа не имеют весов. Я хочу исключить их для расчета.

(В попытках кажется, что учитываются только одинаковые длины, т. Е. Джек и Ноа автоматически исключаются - не так ли?)

Как включить в расчет только людей с ненулевыми значениями?

Спасибо.

import pandas as pd

Weight = {'Name': ["Abigail","Addison","Aiden","Amelia","Aria","Ava","Caden","Charlotte","Chloe","Elijah"], 
'Weight': [10, 0, 12, 20, 25, 10, 0, 18, 16, 13]}

df_wt = pd.DataFrame(Weight)

Score = {'Name': ["Abigail","Addison","Aiden","Amelia","Aria","Ava","Caden","Charlotte","Chloe","Elijah", "Jack", "Noah"], 
'Score': [360, 476, 345, 601, 604, 313, 539, 531, 507, 473, 450, 470]}

df_sc = pd.DataFrame(Score)

print df_wt.Weight.corr(df_sc.Score)

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Используйте map для добавления нового столбца, удалите 0 строк на boolean indexing и в последний раз примените решение в том же фрейме данных:

df_wt['Score'] = df_wt['Name'].map(df_sc.set_index('Name')['Score'])

df_wt = df_wt[df_wt['Weight'].ne(0)]
print (df_wt)
        Name  Weight  Score
0    Abigail      10    360
2      Aiden      12    345
3     Amelia      20    601
4       Aria      25    604
5        Ava      10    313
7  Charlotte      18    531
8      Chloe      16    507
9     Elijah      13    473

print (df_wt.Weight.corr(df_wt.Score))
0.923425144491911
0 голосов
/ 16 января 2019

Маскировка и взятие ненулевых значений и общего индекса:

df_wt.set_index('Name', inplace=True)
df_sc.set_index('Name', inplace=True)

mask = df_wt['Weight'].ne(0)
common_index = df_wt.loc[mask, :].index
df_wt.loc[common_index, 'Weight'].corr(df_sc.loc[common_index, 'Score'])

0.923425144491911

Если оба кадра данных содержат нули, то:

mask1 = df_wt['Weight'].ne(0)
mask2 = df_sc['Score'].ne(0)
common_index = df_wt.loc[mask1, :].index.intersection(df_sc.loc[mask2, :].index)
df_wt.loc[common_index, 'Weight'].corr(df_sc.loc[common_index, 'Score'])
...