Convert whole dataframe from lower case to upper case with Pandas

前端 未结 6 797
忘掉有多难
忘掉有多难 2020-12-13 18:12

I have a dataframe like the one displayed below:

# Create an example dataframe about a fictional army
raw_data = {\'regiment\': [\'Nighthawks\', \'Nighthawk         


        
相关标签:
6条回答
  • 2020-12-13 18:49

    try this

    df2 = df2.apply(lambda x: x.str.upper() if x.dtype == "object" else x)  
    
    0 讨论(0)
  • 2020-12-13 18:59

    this can be solved by the following applymap operation:

    df = df.applymap(lambda s:s.lower() if type(s) == str else s)
    
    0 讨论(0)
  • 2020-12-13 19:01

    astype() will cast each series to the dtype object (string) and then call the str() method on the converted series to get the string literally and call the function upper() on it. Note that after this, the dtype of all columns changes to object.

    In [17]: df
    Out[17]: 
         regiment company deaths battles size
    0  Nighthawks     1st    kkk       5    l
    1  Nighthawks     1st     52      42   ll
    2  Nighthawks     2nd     25       2    l
    3  Nighthawks     2nd    616       2    m
    
    In [18]: df.apply(lambda x: x.astype(str).str.upper())
    Out[18]: 
         regiment company deaths battles size
    0  NIGHTHAWKS     1ST    KKK       5    L
    1  NIGHTHAWKS     1ST     52      42   LL
    2  NIGHTHAWKS     2ND     25       2    L
    3  NIGHTHAWKS     2ND    616       2    M
    

    You can later convert the 'battles' column to numeric again, using to_numeric():

    In [42]: df2 = df.apply(lambda x: x.astype(str).str.upper())
    
    In [43]: df2['battles'] = pd.to_numeric(df2['battles'])
    
    In [44]: df2
    Out[44]: 
         regiment company deaths  battles size
    0  NIGHTHAWKS     1ST    KKK        5    L
    1  NIGHTHAWKS     1ST     52       42   LL
    2  NIGHTHAWKS     2ND     25        2    L
    3  NIGHTHAWKS     2ND    616        2    M
    
    In [45]: df2.dtypes
    Out[45]: 
    regiment    object
    company     object
    deaths      object
    battles      int64
    size        object
    dtype: object
    
    0 讨论(0)
  • 2020-12-13 19:04

    Since str only works for series, you can apply it to each column individually then concatenate:

    In [6]: pd.concat([df[col].astype(str).str.upper() for col in df.columns], axis=1)
    Out[6]: 
         regiment company deaths battles size
    0  NIGHTHAWKS     1ST    KKK       5    L
    1  NIGHTHAWKS     1ST     52      42   LL
    2  NIGHTHAWKS     2ND     25       2    L
    3  NIGHTHAWKS     2ND    616       2    M
    

    Edit: performance comparison

    In [10]: %timeit df.apply(lambda x: x.astype(str).str.upper())
    100 loops, best of 3: 3.32 ms per loop
    
    In [11]: %timeit pd.concat([df[col].astype(str).str.upper() for col in df.columns], axis=1)
    100 loops, best of 3: 3.32 ms per loop
    

    Both answers perform equally on a small dataframe.

    In [15]: df = pd.concat(10000 * [df])
    
    In [16]: %timeit pd.concat([df[col].astype(str).str.upper() for col in df.columns], axis=1)
    10 loops, best of 3: 104 ms per loop
    
    In [17]: %timeit df.apply(lambda x: x.astype(str).str.upper())
    10 loops, best of 3: 130 ms per loop
    

    On a large dataframe my answer is slightly faster.

    0 讨论(0)
  • 2020-12-13 19:08

    if you want to conserv de dtype use is isinstance(obj,type)

    df.apply(lambda x: x.str.upper().str.strip() if isinstance(x, object) else x)
    
    0 讨论(0)
  • 2020-12-13 19:10

    Loops are very slow instead of using apply function to each and cell in a row, try to get columns names in a list and then loop over list of columns to convert each column text to lowercase.

    Code below is the vector operation which is faster than apply function.

    for columns in dataset.columns:
        dataset[columns] = dataset[columns].str.lower() 
    
    0 讨论(0)
提交回复
热议问题