【问题标题】:How to copy means values of one column to another if two other column strings match?如果其他两个列字符串匹配,如何将一列的值复制到另一列?
【发布时间】:2019-06-26 00:10:21
【问题描述】:

我想在数据框中重新排列名称(如下所示),但保留它们的平均分数。所以我知道我可以执行以下操作来获取每个人的值列表:

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

但是我怎样才能以正确的顺序将它们放入新的数据帧 (df2) 中。我使用了“转换”方法,但没有将名称和他们的平均分数作为一个实体附加。相反,它只是以相同的顺序将 df1 中的值复制到 df2 中(显示在 df2(Attempted) 中,如下所示)。我相信这有一个简单的解决方案!

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

【问题讨论】:

  • 你如何重新排列它们,有什么意义,你想按AverageScoreP1排序?据我了解,您只想重新排列表格,因此分数仍然与您计算它的人相关。唯一的问题是你想怎么安排它
  • 所以我制作了 df1,其平均分数与每个名称正确关联。对于“df2”,我有以替代顺序提供给我的 Person 1 和 Person 2 列。我想将人 1 和 2 的正确配对及其分数从 df1 复制到 df2。实际数据要大得多,因此想知道我可以做到这一点的快速方法
  • 所以你有完整的表 df1 和 df 2 的前两列,你想完成它们,对吗?
  • 是的,就是这样。

标签: python pandas


【解决方案1】:

这是一种方法(cmets inline):

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

【讨论】:

    【解决方案2】:
    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)
    

    这样的事情就可以解决问题

    【讨论】:

    • @anky_91 为什么?在 cmets 讨论之后,它似乎完全符合需要,我首先认为问题是如何重新排列行,有点,但你会注意到 df2 对与 df1 不同,所以你必须单独搜索 person1 和person2(示例对 1)James + Sarah2)Martin+Sarah
    猜你喜欢
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2018-10-11
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    相关资源
    最近更新 更多