Python: добавление агрегированных столбцов в DataFrame на основе ключа и дополнительных условий - PullRequest
0 голосов
/ 20 июня 2019

У меня есть 2 кадра данных в следующем представлении: dogs кадр данных:

DogID   PuppyName1  PuppyName2  PuppyName3  PuppyName4   DogWeight
Dog1       Nick         NaN         NaN      NaN            12.7
Dog2       Jack         Fox         Rex      NaN            15.5         
Dog3       Snack        NaN         NaN      NaN            10.2
Dog4       Yosee        Petty       NaN      NaN            16.9

puppyWeights кадр данных:

PuppyName   Jan17  Jun18  Dec18  April19   
Nick         0.8    1.7     3.7     4.6
Jack         0.6    1.3     2.8     3.5        
Fox          0.9    1.7     3.4     4.3
Rex          1.0    2.3     3.0     4.2
Snack        0.8    1.7     2.8     4.4
Yosee        0.6    1.2     3.1     4.3
Petty        0.5    1.3     2.8     3.5 

Мне нужно добавить информацию о весе щенковпо месяцам до Dogs кадра данных на основе PuppyWeights кадра данных.Если у собаки более 1 ребенка, например: Dog2, Dog3 -> мне нужно принять среднее значение веса на PuppyName для каждого месяца.Например: Dog2 должно быть средним между значениями для Jack и Fox в таблице PuppyWeights:

DogID   Jan17  Jun18  Dec18  April19   DogWeight
Dog2     0.75  1.5     3.1     3.9        15.5     

Я пытался использовать функцию melt для преобразования ['PuppyName1', 'PuppyName2', 'PuppyName3', 'PuppyName4'] столбцов в строки.

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

df2 = dogs.melt(id_vars=['DogID','DogWeight'], var_name="Puppies", value_name='PuppyName')

Желаемый результат:

DogID   Jan17  Jun18  Dec18  April19   DogWeight
Dog1     0.8    1.7    3.7     4.6        12.7     
Dog2     0.75   1.5    3.1     3.9        15.5   
Dog3     0.8    1.7    2.8     4.4        10.2
Dog4     0.55   1.25   2.95    3.9        16.9  

Как я могу добавить информацию о весе по месяцам к dogs кадру данных?

Буду признателен за любую идею.Спасибо)

1 Ответ

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

Вот один из способов melt dogs, затем merge и groupby

df2 = dogs.melt(id_vars=['DogID','DogWeight'], var_name="Puppies", value_name='PuppyName').dropna()

df2.merge(df,on='PuppyName',how='left').groupby('DogID').mean()
Out[423]: 
       DogWeight     Jan17     Jun18     Dec18  April19
DogID                                                  
Dog1        12.7  0.800000  1.700000  3.700000      4.6
Dog2        15.5  0.833333  1.766667  3.066667      4.0
Dog3        10.2  0.800000  1.700000  2.800000      4.4
Dog4        16.9  0.550000  1.250000  2.950000      3.9
...