получить среднее значение столбца после объединения, добавив один столбец в конце другого в пандах

У меня есть набор данных, который выглядит следующим образом:

    Interactor A    Interactor B    Interaction Score   score2
0   P02574  P39205  0.928736    0.375000
1   P02574  Q6NR18  0.297354    0.166667
2   P02574  Q7KML4  0.297354    0.142857
3   P02574  Q9BP34  0.297354    0.166667
4   P02574  Q9BP35  0.297354    0.16666

data.shape = (112049, 5)

Я хочу добавить Interactor B в конце столбца Interactor A и добавить столбец, который показывает их ранг. Я сделал это путем:

cols = [data[col].squeeze() for col in data[['Interactor A','Interactor B']]]
n =pd.concat(cols, ignore_index=True)
n = pd.DataFrame(n,columns = ['AB'])

сделать столбец уникальным:

t = pd.unique(n['AB'])
t= pd.DataFrame(t, columns=[ "AB"])

тогда :

t2 = n.groupby(['AB'],sort=False).size()
t2 = pd.DataFrame(t2)

наконец: объединяя t2 и t:

data_1 = pd.concat([t,l], axis=1)


AB  Rank
0   P02574  4


data.shape = (13631, 2)

Теперь я хочу добавить столбец « Interaction Score и « score2 в DF. если есть дубликаты, возьмите среднее значение их Interaction Score удалите дубликаты и замените значение показателя Interaction Score на среднее значение.

Я использовал :

score2 = data.groupby(['Interactor A','Interactor B'])['score2'].mean()
score2 = pd.DataFrame(score2, columns=['score2']) 

вывод в этом случае выглядит так:

        score2
Interactor A    Interactor B    
A0A023GPK8  Q9VQW1  0.200000
A0A076NAB7  Q9VYN8  0.000000
A0A0B4JD97  Q400N2  0.000000
Q9VC64  0.090909
Q9VNE4  0.307692

112049 rows × 1 columns

но я должен добавить столбцы со средним значением 'score2' и 'Interaction Score' для 13631 уникальных данных, которые я сделал. Как можно этого добиться ?? пожалуйста помоги. конечный df должен быть таким:

Оценка Интерактора Оценка взаимодействия счет2 P02574 5 0,928736 0,44

то есть: Score2 - это среднее значение всех оценок «P0257», которые были в наборе данных.

Всего 1 ответ


IIUC. Вам просто нужно изменить форму данных с широкого на длинный, а затем запустить агрегацию, предполагая, что баллы совпадают с интеракторами один за другим. Рассмотрим wide_to_long для изменения формы после настройки имен заглушек и поля id. Затем запустите groupby().agg() для подсчетов и средних groupby().agg() .

Данные

from io import StringIO
import pandas as pd    

txt = '''    "Interactor A"    "Interactor B"    "Interaction Score"   "score2"
0   P02574  P39205  0.928736    0.375000
1   P02574  Q6NR18  0.297354    0.166667
2   P02574  Q7KML4  0.297354    0.142857
3   P02574  Q9BP34  0.297354    0.166667
4   P02574  Q9BP35  0.297354    0.16666'''

data = pd.read_csv(StringIO(txt), sep="s+")

Reshape

# FOR id FIELD
data["id"] = data.index

# FOR STUB NAMES
data = data.rename(columns={"Interaction Score": "score A",
                            "score2": "score B"})

df_long = pd.wide_to_long(data, ["Interactor", "score"], i="id", 
                           j="score_type", sep=" ", suffix="(A|B)")

df_long
#               Interactor     score
# id score_type                     
# 0  A              P02574  0.928736
# 1  A              P02574  0.297354
# 2  A              P02574  0.297354
# 3  A              P02574  0.297354
# 4  A              P02574  0.297354
# 0  B              P39205  0.375000
# 1  B              Q6NR18  0.166667
# 2  B              Q7KML4  0.142857
# 3  B              Q9BP34  0.166667
# 4  B              Q9BP35  0.166660

Агрегация Интерактора

df_long.groupby(["Interactor"])["score"].agg(["count", "mean"])

#            count      mean
# Interactor
# P02574         5  0.423630
# P39205         1  0.375000
# Q6NR18         1  0.166667
# Q7KML4         1  0.142857
# Q9BP34         1  0.166667
# Q9BP35         1  0.166660

Interactor + Score Groupby Агрегация

df_long.groupby(["Interactor", "score_type"])['score'].agg(["count", "mean"])

#                        count      mean
# Interactor score_type                 
# P02574     A               5  0.423630
# P39205     B               1  0.375000
# Q6NR18     B               1  0.166667
# Q7KML4     B               1  0.142857
# Q9BP34     B               1  0.166667
# Q9BP35     B               1  0.166660

Интегратор + агрегирование баллов

df_long.pivot_table(index="Interactor", columns="score_type", values='score',
                    aggfunc = ["count", "mean"])

#            count          mean          
# score_type     A    B        A         B
# Interactor                              
# P02574       5.0  NaN  0.42363       NaN
# P39205       NaN  1.0      NaN  0.375000
# Q6NR18       NaN  1.0      NaN  0.166667
# Q7KML4       NaN  1.0      NaN  0.142857
# Q9BP34       NaN  1.0      NaN  0.166667
# Q9BP35       NaN  1.0      NaN  0.166660

Есть идеи?

10000