根据其他列值修改数据框列

时间:2019-02-20 23:09:31

标签: python pandas dataframe

我有一个包含两列的数据框,并想根据另一列的值修改一列。

示例

unit        name
feet        abcd_feet
celcius     abcd_celcius
yard        bcde_yard
yard        bcde

如果单位是feetyard,并且名称以它结尾,那么我想将其从列中删除。

unit        name
feet        abcd
celcius     abcd_celcius
yard        bcde
yard        bcde

1 个答案:

答案 0 :(得分:1)

有两种方法可以解决您的问题:

第一种方法,因为熊猫是基于列的,所以速度更快:

UNITS_TO_REMOVE = {'feet', 'yard'}

df['value_'], df['unit_'] = df['name'].str.split('_').str
values_to_clean = (df['unit_'].isin(UNITS_TO_REMOVE)) & (df['unit_'] == df['unit'])
df.loc[values_to_clean, 'name'] = df.loc[values_to_clean, 'value_']
df.drop(columns=['unit_', 'value_'], inplace=True)

这是结果,

    unit    name
0   feet    abcd
1   celcius abcd_celcius
2   yard    bcde
3   yard    bcde

性能:每个循环20 ms±401 µs(平均±标准偏差,运行7次,每个循环100个循环)(在一个(4000,2)数据帧上)


第二种方法,使用Apply(有时有时是唯一可用的解决方案):

UNITS_TO_REMOVE = {'feet', 'yard'}

def remove_unit(unit, value):
    if unit not in UNITS_TO_REMOVE or '_' not in value:
        return value
    else:
        row_value, row_unit = value.split('_')
        if row_unit == unit:
            return row_value
        else:
            return value

df['name'] = df.apply(lambda row: remove_unit(row['unit'], row['name']), axis=1)

输出:


    unit    name
0   feet    abcd
1   celcius abcd_celcius
2   yard    bcde
3   yard    bcde

性能:每个循环152毫秒±3.95毫秒(平均±标准偏差,共运行7次,每个循环10个循环)