【问题标题】:Convert whole dataframe from lower case to upper case with Pandas使用 Pandas 将整个数据帧从小写转换为大写
【发布时间】:2017-01-23 12:46:58
【问题描述】:

我有一个如下所示的数据框:

# Create an example dataframe about a fictional army
raw_data = {'regiment': ['Nighthawks', 'Nighthawks', 'Nighthawks', 'Nighthawks'],
            'company': ['1st', '1st', '2nd', '2nd'],
            'deaths': ['kkk', 52, '25', 616],
            'battles': [5, '42', 2, 2],
            'size': ['l', 'll', 'l', 'm']}
df = pd.DataFrame(raw_data, columns = ['regiment', 'company', 'deaths', 'battles', 'size'])

我的目标是将数据框中的每个字符串都转换为大写,使其看起来像这样:

注意:所有数据类型均为对象,不得更改;输出必须包含所有对象。我想避免将每一列一一转换...我想一般在整个数据帧上进行。

到目前为止我尝试的是这样做但没有成功

df.str.upper()

【问题讨论】:

  • str 仅适用于系列...

标签: python pandas type-conversion uppercase lowercase


【解决方案1】:

astype() 会将每个系列转换为dtype 对象(字符串),然后在转换后的系列上调用str() 方法以逐字获取字符串并在其上调用函数upper()。请注意,在此之后,所有列的 dtype 都会更改为 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

您稍后可以使用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

【讨论】:

    【解决方案2】:

    这可以通过以下applymap方法解决:

    df = df.applymap(lambda s: s.lower() if type(s) == str else s)
    

    【讨论】:

    • 这对我来说效果最好,但我相信 OP 想要全部大写。但是,我确实必须这样做str(s).lower()
    • 如果将lower 替换为upper,它应该适用于所有大写字母。对我来说效果很好!
    • 在我看来,这个答案比公认的要好得多
    【解决方案3】:

    循环非常慢,而不是对行中的每个单元格使用应用函数,尝试获取列表中的列名,然后遍历列列表以将每列文本转换为小写。

    下面的代码是比apply函数更快的向量运算。

    for columns in dataset.columns:
        dataset[columns] = dataset[columns].str.lower() 
    

    【讨论】:

    • Nice def m3(dataset): for columns in dataset.columns: dataset[columns] = dataset[columns].str.upper() return dataset %timeit pd.concat([df[col].astype(str).str.upper() for col in df.columns], axis=1) %timeit df.apply(lambda x: x.astype(str).str.upper()) %timeit m3(df) 每个循环 70.5 毫秒 ± 1.26 毫秒(平均值 ± 7 次运行的标准偏差,每个循环 10 个循环)每个循环 82.1 毫秒 ± 1.46 毫秒(平均值 ± 标准偏差 7运行,每个循环 10 个循环)每个循环 40.8 ms ± 546 µs(7 次运行的平均值 ± 标准偏差,每个循环 10 个循环)
    【解决方案4】:

    由于str 仅适用于系列,您可以将其单独应用于每一列,然后连接:

    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
    

    编辑:性能比较

    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
    

    两个答案在小数据帧上的表现相同。

    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
    

    在大型数据框上,我的回答会稍微快一些。

    【讨论】:

    • 是否会将列名改为小写?
    • @PiyushS.Wanare 不,不应该。
    • 我该怎么做?
    • df.columns = df.columns.str.lower()
    【解决方案5】:

    试试这个

    df2 = df2.apply(lambda x: x.str.upper() if x.dtype == "object" else x)  
    

    【讨论】:

      【解决方案6】:

      如果您想保留 dtype,请使用 isinstance(obj,type)

      df.apply(lambda x: x.str.upper().str.strip() if isinstance(x, object) else x)
      

      【讨论】:

        猜你喜欢
        • 2011-07-21
        • 2020-09-02
        • 2018-02-28
        • 2019-03-13
        • 1970-01-01
        • 1970-01-01
        • 2014-11-07
        • 2019-05-15
        • 2015-11-28
        相关资源
        最近更新 更多