【问题标题】:Change value of a specific column on dataframe subgroups in pandas based on condition根据条件更改熊猫数据框子组上特定列的值
【发布时间】:2020-12-14 18:43:27
【问题描述】:

我有一个类似于下面的数据框:

A B  C
1 0 0.0
1 2 0.2
1 3 1.0
2 1 0.2
2 4 0.0
2 6 1.0
3 1 0.4
3 2 1.0
3 0 0.9
3 3 0.0

现在,对于每个子组,其中子组将具有共享 A 值,我想找到具有最小 B 值的行,然后将该行的 C 值更改为 0.5。在这种情况下,我会获得一个新的数据框:

A B  C
1 0 0.5
1 2 0.2
1 3 1.0
2 1 0.5
2 4 0.0
2 6 1.0
3 1 0.4
3 2 1.0
3 0 0.5
3 3 0.0

作为附录,如果此操作替换 C 列中的 0.0 或 1.0,那么我希望该行与其旧值重复。在这种情况下,A=1 子组违反了此规则(0.0 被 0.5 替换),因此应该产生:

A B  C
1 0 0.0
1 0 0.5
1 2 0.2
1 3 1.0
...

第一个问题是主要问题,第二个不是优先问题,但当然,欢迎帮助。

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    试试:

    df.loc[df.groupby('A')['B'].idxmin(), 'C'] = 0.5
    

    输出:

       A  B    C
    0  1  0  0.5
    1  1  2  0.2
    2  1  3  1.0
    3  2  1  0.5
    4  2  4  0.0
    5  2  6  1.0
    6  3  1  0.4
    7  3  2  1.0
    8  3  0  0.5
    9  3  3  0.0
    

    关于附录:

    # minimum B rows 
    min_rows = df.groupby('A')['B'].idxmin()
    # minimum B rows with C==0
    zeros = df.loc[min_rows].loc[lambda x: x['C']==0].copy()
    
    # change all min rows to 0.5
    df.loc[min_rows, 'C'] = 0.5
    
    # concat with 0
    df = pd.concat([df, zeros])
    

    输出(注意最后一行):

       A  B    C
    0  1  0  0.5
    1  1  2  0.2
    2  1  3  1.0
    3  2  1  0.5
    4  2  4  0.0
    5  2  6  1.0
    6  3  1  0.4
    7  3  2  1.0
    8  3  0  0.5
    9  3  3  0.0
    0  1  0  0.0
    

    【讨论】:

    • 正是我需要的,非常感谢!
    • @QuangHoang,添加了一个替代方案,不需要 concat。如果你没问题
    • @sammywemmy 如果没有concat,它将无法工作。当最小值发生在 01(我错过了)时,OP 想要在数据中添加一行 0.5
    • 哦,我也错过了:)。谢谢
    猜你喜欢
    • 2023-02-21
    • 2023-02-02
    • 2019-11-07
    • 2019-06-21
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    相关资源
    最近更新 更多