【问题标题】:Update values of column conditionally dependent on another column in pandas有条件地根据熊猫中的另一列更新列的值
【发布时间】:2021-09-03 04:01:14
【问题描述】:

我有一个熊猫数据框如下:

  name origin delta
0 foo  raw_x   3
1 foo  raw_y   3
2 bar  raw_z   4
3 bar  raw_z   4
4 foobar raw_a  1
5 foobar raw_b  1

name = bar 的行中,origin 的值相同,因此我可以删除重复项。但是在name = foo 的行中,origin 的值是不同的。我想修改/更新同一数据框中的值,如下所示,

foo -> foo_x where raw_x
foo -> foo_y where raw_y
foobar -> foobar_a where raw_a
foobar -> foobar_b where raw_b

无法像if name == 'foo' 这样进行名称检查,因此我们必须使用name 列中相同的值。如何做到这一点?

【问题讨论】:

    标签: python pandas list dataframe numpy


    【解决方案1】:

    IIUC,你可以试试:

    df['name'] = (
        df.groupby('name', sort=False)
        .apply(
            lambda x: x['name'] + '_' + x['origin'].str.rsplit('_', 1).str[1]
            if x['origin'].nunique() > 1
            else
            x['name']
        ).values
    )
    

    完整示例:

    df = pd.DataFrame({'name': {0: 'foo', 1: 'foo', 2: 'bar', 3: 'bar', 4: 'foobar', 5: 'foobar'},
                       'origin': {0: 'raw_x',
                                  1: 'raw_y',
                                  2: 'raw_z',
                                  3: 'raw_z',
                                  4: 'raw_a',
                                  5: 'raw_b'},
                       'delta': {0: 3, 1: 3, 2: 4, 3: 4, 4: 1, 5: 1}})
    
    df['name'] = (
        df.groupby('name', sort=False)
        .apply(
            lambda x: x['name'] + '_' + x['origin'].str.rsplit('_', 1).str[1]
            if x['origin'].nunique() > 1
            else
            x['name']
        ).values
    )
    
    输出:
           name origin  delta
    0     foo_x  raw_x      3
    1     foo_y  raw_y      3
    2       bar  raw_z      4
    3       bar  raw_z      4
    4  foobar_a  raw_a      1
    5  foobar_b  raw_b      1
    

    【讨论】:

      猜你喜欢
      • 2012-05-29
      • 2022-12-16
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 2023-02-15
      • 1970-01-01
      相关资源
      最近更新 更多