簡體   English   中英

根據另一列值修改數據框列

[英]Modifying dataframe column based on another column values

我有一個包含兩列的數據框,想根據另一列的值修改一列。

例子

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

有兩種可能的方法可以解決您的問題:

第一種方法,速度更快,因為熊貓是基於列的:

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 ms ± 3.95 ms(7 次運行的平均值 ± 標准偏差,每次 10 次循環)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM