在多列上使用df.apply的更好方法是什么?

时间:2018-09-27 19:36:39

标签: python pandas

在尝试使用csv文件编码后,我决定执行手动替换某些字符的编码方法。

数据框的外观如下:

df = pd.DataFrame({'a' : 'bÉd encoded',
               'b' : ['foo', 'bar'] * 3,
               'c' : 'bÉd encoded too'})


              a    b                 c
0  bÉd encoded  foo  bÉd encoded too
1  bÉd encoded  bar  bÉd encoded too
2  bÉd encoded  foo  bÉd encoded too
3  bÉd encoded  bar  bÉd encoded too
4  bÉd encoded  foo  bÉd encoded too
5  bÉd encoded  bar  bÉd encoded too

如果我唯一的问题是列“ a”,则此功能就足够了:

def force_good_e(row):
    col = row['a']
    if 'É' in col:
        col = col.replace('É','a') 
    return col

df['a'] = df.apply(force_good_e, axis=1)

但随后我需要为列'c'提供另一个功能

我对此有所改进

def force_good_es(row, column):
    col = row[column]
    if 'É' in col:
        col = col.replace('É','a') 
    return col


df['a'] = df.apply(lambda x: force_good_es(x,'a'), axis=1)
df['c'] = df.apply(lambda x: force_good_es(x,'c'), axis=1)

但这让我想知道,还有更好的方法吗?

即无需制作一行

df[n] = df.apply(lambda x: force_good_es(x,n), axis=1)

每个需要修复的n列。

2 个答案:

答案 0 :(得分:2)

您可以使用str.replace

df['a'] = df['a'].str.replace('É','a')
df['c'] = df['c'].str.replace('É','a')

或像评论中提到的@wen一样。

df = df.replace({'É':'a'},regex=True)

答案 1 :(得分:1)

如果该字符出现在所有列中,但您只想在选定的列中替换它,并且要使用apply

df.iloc[:,[0,2]].apply(lambda x: x.str.replace('É','a'), axis=1)

第一列和第三列中É的出现将由a代替。