与pandas中的特定字符串不匹配时转换为大写

x33g5p2x  于 2023-06-20  发布在  其他
关注(0)|答案(2)|浏览(98)

当列值与特定字符串不匹配时,需要转换为大写,否则在pandas中应该是相同的源值。

import pandas as pd
import numpy as np

df = pd.DataFrame({'freq': ['/Weekly/', '/ad/','/Annual/', '/aB/'],
                         'typ': ['TEST', 'A','TEST2', 'YYYY'],                                    
                        'category': ['ACC', 'T','TEST3', 'ZZZZ'],
                        'id': ['1', '2','3', '4']})
Code:
df['tgt'] = np.where((df[~df.freq.str.startswith(('/Wee','/Ann'))],df['freq'].astype(str).str.upper(),df['freq']))

Expected output: 
    freq       typ          category    id   tgt 
0   /Weekly/    TEST          ACC       1   /Weekly/
1   /ad/        A             T         2   /AD/
2   /Annual/    TEST2         TEST3     3   /Annual
3   /aB/        YYYY          ZZZZ      4   /AB/
aurhwmvo

aurhwmvo1#

初始代码中的错误与np.where的使用有关。函数的条件应该作为第一个参数传递,但在原始代码中,它被应用于DataFrame本身。要解决这个问题,需要修改代码,将df[~df.freq.str.startswith(('/Wee','/Ann'))]替换为~df['freq'].str.startswith(('/Wee', '/Ann'))
下面是完整的代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({'freq': ['/Weekly/', '/ad/','/Annual/', '/aB/'],
                         'typ': ['TEST', 'A','TEST2', 'YYYY'],                                    
                        'category': ['ACC', 'T','TEST3', 'ZZZZ'],
                        'id': ['1', '2','3', '4']})

df['tgt'] = np.where(
    ~df['freq'].str.startswith(('/Wee', '/Ann')), 
    df['freq'].astype(str).str.upper(), 
    df['freq']
)

此外,在我看来,你可以直接使用df['freq'].str.upper(),而不是使用astype(str).str.upper()将其转换为字符串。

vltsax25

vltsax252#

df.where

df['tgt'] = df['freq'].where(df['freq'].str.startswith(('/Wee','/Ann')), df['freq'].str.upper())
freq    typ category id       tgt
0  /Weekly/   TEST      ACC  1  /Weekly/
1      /ad/      A        T  2      /AD/
2  /Annual/  TEST2    TEST3  3  /Annual/
3      /aB/   YYYY     ZZZZ  4      /AB/

相关问题