在pandas中,如果一列数据相同,我如何合并行,并有效地改变合并列上另一列的值?

问题描述 投票:0回答:1

我正在尝试合并行,如果某些列的值是相同的。我一直在使用groupby,然后根据特定的条件替换数据列的值。我想知道是否有更好的选择来做我想做的事情。

这是我一直在做的

data={'Name': {0: 'Sam', 1: 'Amy', 2: 'Cat', 3: 'Sam', 4: 'Kathy'},
 'Subject1': {0: 'Math', 1: 'Science', 2: 'Art', 3: np.nan, 4: 'Science'},
 'Subject2': {0: np.nan, 1: np.nan, 2: np.nan, 3: 'English', 4: np.nan},
 'Result': {0: 'Pass', 1: 'Pass', 2: 'Fail', 3: 'TBD', 4: 'Pass'}}

df=pd.DataFrame(data)
df=df.groupby('Name').agg({
 'Subject1': 'first',
 'Subject2': 'first',
 'Result': ', '.join}).reset_index()

df['Result']=df['Result'].apply(lambda x: 'RESULT_FAILED' if x=='Pass, TBD'  else x )

开始:df看起来像。

    Name    Subject1    Subject2    Result
0   Sam     Math    NaN     Pass
1   Amy     Science     NaN     Pass
2   Cat     Art     NaN     Fail
3   Sam     NaN     English     TBD
4   Kathy   Science     NaN     Pass

我想要的最终结果是:

    Name    Subject1    Subject2    Result
0   Amy     Science     NaN     Pass
1   Cat     Art     NaN     Fail
2   Kathy   Science     NaN     Pass
3   Sam     Math    English     RESULT_FAILED

我相信,如果有超过100列,这可能不是一个好的解决方案。我将不得不手动改变聚合的字典。

我试过使用.NET来进行聚合。df.groupby('Name')['Result'].agg(' '.join).reset_index() 但我只得到2列。

python-3.x pandas pandas-groupby
1个回答
1
投票

你的样本显示每个独特的名字都有单一的非NaN-------------------。SubjectX 值。即每个 SubjectX 只有一个单一的非纳值,用于重复的。Name. 你可以试试这种方式

import numpy as np

df_final = (df.fillna('').groupby('Name', as_index=False).agg(''.join)
                         .replace({'':np.nan, 'PassTBD': 'RESULT_FAILED'}))

Out[16]:
    Name Subject1 Subject2         Result
0    Amy  Science      NaN           Pass
1    Cat      Art      NaN           Fail
2  Kathy  Science      NaN           Pass
3    Sam     Math  English  RESULT_FAILED
© www.soinside.com 2019 - 2024. All rights reserved.