Python найти среднее значение всех строк по столбцу, а затем найти расстояние - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть датафрейм, как показано ниже. Я понимаю, что df.groupby("degree").mean() даст мне среднее значение по столбцу degree. Я хотел бы взять эти средства и найти расстояние между каждой точкой данных и этими средними. В этом случае. Для каждой точки данных я хотел бы получить 3 расстояния от средних (вывод df.groupby("degree").mean()) (4,40) (2,80) и (4,94) и создать 3 новых столбца. Расстояние должно быть рассчитано по формуле: BCA_mean=(name-4)^3+(score-40)^3,M.Tech_mean=(name-2)^3+(score-80)^3,MBA_mean=(name-4)^3+(score-94)^3

import pandas as pd 

# dictionary of lists 
dict = {'name':[5, 4, 2, 3], 
        'degree': ["MBA", "BCA", "M.Tech", "MBA"], 
        'score':[90, 40, 80, 98]} 

# creating a dataframe from a dictionary  
df = pd.DataFrame(dict) 

print (df)

   name  degree  score
0     5     MBA     90
1     4     BCA     40
2     2  M.Tech     80
3     3     MBA     98


df.groupby("degree").mean()    

degree name score       
BCA     4   40
M.Tech  2   80
MBA     4   94

update1

Мой реальный набор данных содержит более 100 столбцов. Я бы предпочел что-то, что может удовлетворить эту потребность. Логика c остается той же, для каждого среднего вычитают среднее значение из столбца, берут куб каждой ячейки и добавляют

. Я нашел что-то похожее ниже. Но не уверен, есть ли другой эффективный способ

y=df.groupby("degree").mean()
print (y)
import numpy as np
(np.square(df[['name','score']].subtract(y.iloc[0,:],axis=1))).sum(axis=1)

df["mean0"]=(np.square(df[['name','score']].subtract(y.iloc[0,:],axis=1))).sum(axis=1)
df

1 Ответ

1 голос
/ 20 февраля 2020
import pandas as pd 

# dictionary of lists 
dict = {'degree': ["MBA", "BCA", "M.Tech", "MBA","BCA"], 
        'name':[5, 4, 2, 3,2], 
        'score':[90, 40, 80, 98,60],
       'game':[100,200,300,100,400],
       'money':[100,200,300,100,400],
       'loan':[100,200,300,100,400],
       'rent':[100,200,300,100,400],
       'location':[100,200,300,100,400]} 

# creating a dataframe from a dictionary  
df = pd.DataFrame(dict) 

print (df)

dfx=df.groupby("degree").mean()
print(dfx)



def fun(x):

    if x[0]=='BCA':
        return x[1:] - dfx.iloc[0,:].tolist()
    if x[0]=='M.Tech': 
            return x[1:]-dfx.iloc[1,:].tolist()
    if x[0]=='MBA':
            return x[1:]-dfx.iloc[2,:].tolist()


df_added=df.apply(fun,axis=1)
df_added

результат

   degree  name  score  game  money  loan  rent  location
0     MBA     5     90   100    100   100   100       100
1     BCA     4     40   200    200   200   200       200
2  M.Tech     2     80   300    300   300   300       300
3     MBA     3     98   100    100   100   100       100
4     BCA     2     60   400    400   400   400       400
``````
mean  which is dfx
``````````
        name  score  game  money  loan  rent  location
degree                                                
BCA        3     50   300    300   300   300       300
M.Tech     2     80   300    300   300   300       300
MBA        4     94   100    100   100   100       100
````````````
df_added********  
difference of each element from their mean column value
``````````
        name    score   game    money   loan    rent    location
   0       1      -4       0       0       0       0    0
   1       1     -10    -100     -100   -100    -100    -100
   2       0       0       0       0       0       0    0
   3      -1       4       0       0       0       0    0
   4      -1      10      100     100    100     100    100
...