我有一个包含两列的数据框,并想根据另一列的值修改一列。
示例
unit name
feet abcd_feet
celcius abcd_celcius
yard bcde_yard
yard bcde
如果单位是feet
或yard
,并且名称以它结尾,那么我想将其从列中删除。
unit name
feet abcd
celcius abcd_celcius
yard bcde
yard bcde
答案 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个循环)