使用Pandas将整个数据帧从小写转换为大写

Fed*_*ile 13 python type-conversion lowercase uppercase pandas

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

# 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'])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我的目标是将数据帧内的每个字符串转换为大写,以便它看起来像这样:

在此输入图像描述

注意:所有数据类型都是对象,不得更改; 输出必须包含所有对象.我想避免逐个转换每一列......我想在整个数据框中做到这一点.

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

df.str.upper()
Run Code Online (Sandbox Code Playgroud)

Neh*_*ani 28

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
Run Code Online (Sandbox Code Playgroud)

您可以稍后使用to_numeric()将'battles'列再次转换为数字:

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
Run Code Online (Sandbox Code Playgroud)


小智 15

这可以通过以下applymap操作来解决:

df = df.applymap(lambda s:s.lower() if type(s) == str else s)
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说效果最好,但是我相信 OP 想要全部大写。但是,我确实必须执行 `str(s).lower()`。 (2认同)

小智 9

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

下面的代码是比应用函数更快的向量操作。

for columns in dataset.columns:
    dataset[columns] = dataset[columns].str.lower() 
Run Code Online (Sandbox Code Playgroud)


Ian*_*anS 5

由于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
Run Code Online (Sandbox Code Playgroud)

编辑:性能比较

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
Run Code Online (Sandbox Code Playgroud)

这两个答案在较小的数据帧上的性能均相同。

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
Run Code Online (Sandbox Code Playgroud)

在较大的数据帧上,我的答案会稍快一些。


小智 5

尝试这个

df2 = df2.apply(lambda x: x.str.upper() if x.dtype == "object" else x)  
Run Code Online (Sandbox Code Playgroud)