Повторите вычисления по подмножеству фрейма данных в Python - PullRequest
0 голосов
/ 01 ноября 2019

Нужно получить вычисление для каждого пользователя, противоположного всему фрейму данных, из df1.

import pandas as pd
import numpy as np
df = pd.DataFrame({'user': ['Mike', 'Mike', 'Mike','Mike', 'Mike', 'Mike','Mike',
                            'Mike', 'Mike','Mike','Mike', 'Mike','Mike', 'Mike', 
                            'Mike','Mike','Mike', 'Mike','Mike', 'Mike', 'Mike',
                            'Mike', 'Mike','Mike'], 
                   'income': [47559,70850,60081,73353,52043,69038,55156,54532,  
                              64937,73780,69577,68116,42777,55733,44923,51096,
                              74317,75160,52160,56356,74077,70007,69407,79659]})

df1 = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice','Bob', 'Jane', 'Alice','Bob', 
                            'Jane', 'Alice','Bob','Jane','Alice','Bob','Jane',
                            'Alice','Bob', 'Jane','Alice','Bob', 'Jane', 'Alice',
                            'Bob', 'Jane', 'Alice'], 
                   'income': [93426,40594,60920,76683,70643,77195,60496,75527,
                              76784,93686,48243,94225,89828,82593,74815,46937,
                              43372,58319,95770,67525,97085,65901,92556,57715]})

x1 = df['income']


x2 = df1['income'] ### Need this by user opposed to all of df1 'income'
a = max(x1); b = max(x2)
maxval = max(a,b)
c = min(x1); d = min(x2)
minval = max(c,d)

h1, bins= np.histogram(x1, bins = 20, range = (minval, maxval))
h2, _ = np.histogram(x2, bins = 20, range = (minval, maxval))
minval
def return_intersection(h1, h2):
    minima = np.minimum(h1, h2)
    intersection = np.true_divide(np.sum(minima), np.sum(h2))
    return intersection

print(round(return_intersection(h1,h2),2))

Конечная цель состоит в том, чтобы рассчитать перекрытие для каждого пользователя в df1 на df: фактический расчет будет отличатьсяиз приведенных ниже. Числа ниже составлены.

Bob .54
Jane .67
Alice .28

Расчет работает, просто нужно рассчитать его по пользователю.

Попытка использовать, но не повезло, потому что расчет не выполнялся для каждого пользователя:

df1_grouped = df1.groupby('user')
# iterate over each group
for group_name, df_group in df1_grouped:
    for row_index, row in df_group.iterrows():
        col = row['income']

1 Ответ

0 голосов
/ 02 ноября 2019

Я не уверен, что вы делали с примером кода groupby, поскольку col не используется в вашем большем кодовом блоке. Вот мое предположение о том, что вы хотели вместо этого:

x1 = df['income']
for key, x2 in df1.groupby('user')['income']:
    maxval = max(x1.max(), x2.max())
    minval = max(x1.min(), x2.min())

    h1, _ = np.histogram(x1, bins=20, range=(minval, maxval))
    h2, _ = np.histogram(x2, bins=20, range=(minval, maxval))

    minima = np.minimum(h1, h2)
    intersection = np.true_divide(np.sum(minima), np.sum(h2))
    print(key, round(intersection, 2))

# Alice 0.25
# Bob 0.38
# Jane 0.43
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...