如果另外两个列字符串匹配,如何将一列的means值复制到另一列?

2024-04-25 17:29:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我想重新排列一个数据框中的名字(如下所示),但要保持他们的平均分数。所以我知道我可以做以下事情来得到每个人的价值观列表:

df1.groupby('Person1')['AverageScoreP1'].mean()
df1.groupby('Person2')['AverageScoreP2'].mean()

但是我怎样才能将它们以正确的顺序放入新的数据帧(df2)中呢。我使用了“transform”方法,但没有将名称和它们的平均分作为一个实体。相反,它只是以相同的顺序将值从df1复制到df2(如下面的df2(尝试)所示)。我相信这有一个简单的解决办法!你知道吗

df1型:

Person 1    Person 2    AverageScoreP1   AverageScoreP2

Sam         Ellie       2.3              10.2
James       Sarah       4.5              8.8
Steven      Jane        6.6              3.5
Martin      Becky       7.7              2.0

df2型:

我想展示的是:

Person 1    Person 2    AverageScoreP1   AverageScoreP2

Martin      Sarah       7.7              8.8
Steven      Becky       6.6              2.0
Sam         Ellie       2.3              10.2
James       Jane        4.5              3.5

df2(已尝试):

Person 1    Person 2    AverageScoreP1   AverageScoreP2

Martin      Sarah       2.3              10.2
Steven      Becky       4.5              8.8
Sam         Ellie       6.6              3.5
James       Jane        7.7              2.0

Tags: 数据sampersonmartindf1df2groupbyjane
2条回答

这里有一种方法(内联注释):

df1.columns=df1.columns.str.replace(' ','') #replace spaces, if required create a copy df
d=dict(pd.wide_to_long(df1.reset_index(),['Person','AverageScoreP'],
                 i='index',j='v').values) #create a dict of name and avg score


m=df2.replace(d) #replace df2 with dict
m.columns=[i for i in df1.columns if 'Person' not in i] #change col names
df2=df2.join(m) #join with df2

  Person 1 Person 2  AverageScoreP1  AverageScoreP2
0   Martin    Sarah             7.7             8.8
1   Steven    Becky             6.6             2.0
2      Sam    Ellie             2.3            10.2
3    James     Jane             4.5             3.5
def search_score1(person1):
    return df1[df1.Person1==person1].AverageScoreP1
def search_score2(person2):
    return df1[df1.Person2==person2].AverageScoreP2,  


df2['search_score1']==df2.apply(lambda x:search_score1(x.Person1),axis=1)
df2['search_score2']==df2.apply(lambda x:search_score2(x.Person2),axis=1)

像这样的东西就行了

相关问题 更多 >