Python 将一列连接到另一列的末尾后,获取列的平均值
我的数据集如下所示:Python 将一列连接到另一列的末尾后,获取列的平均值,python,pandas,dataframe,pandas-groupby,data-science,Python,Pandas,Dataframe,Pandas Groupby,Data Science,我的数据集如下所示: 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
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)
我想在interactitor A
列的末尾添加interactitor B
,并添加一个显示其排名的列。
我是这样做的:
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)
现在我想将交互分数
和score2
列添加到DF中。如果存在重复项,则取其交互得分
的平均值,删除重复项,并用平均值替换交互得分
的值
我用过:
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
ie:score2是数据集中所有“P0257”分数的平均值IIUC-您只需将数据从宽改为长,然后运行聚合,假设分数与交互者一一对应。在设置存根名称和ID字段后考虑重新创建。然后,运行
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+")
重塑
# 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
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
交互者+分数分组聚合
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
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
互动者+分数轴聚合
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
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
让你的例子更短,请阅读如何提供一个我把它变小了,你能帮助回答吗@yatuIt很难跟踪您的
数据在整个过程中是如何变化的。您如何连接t
和t2
?您是否将其重新分配给数据
对象?请包括所有相关的代码,而不仅仅是代码片段。还不清楚您到底想做什么。请根据您在第一个代码块中的第一个数据
DF提供您期望的最终DF。谢谢,这是“得分a”的意思吗?我怎样才能加上“得分B”的意思呢?每个得分都是与每个交互者平行重塑的。但是,您可以在每个级别上运行聚合。请参阅编辑。很高兴听到并乐于帮助!快乐编码!