使用Pandas将整个 Dataframe 从小写转换为大写

kq4fsx7k  于 2022-12-16  发布在  其他
关注(0)|答案(8)|浏览(275)

我有一个如下所示的 Dataframe :

# 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'])

我的目标是将 Dataframe 中的每个字符串都转换为大写,这样看起来就像这样:

注意:所有数据类型都是对象,不能更改;输出必须包含所有对象。2我想避免一个接一个地转换每一列......我想尽可能地在整个 Dataframe 上做这件事。
到目前为止,我尝试过这样做,但没有成功

df.str.upper()
wsewodh2

wsewodh21#

astype()会将每个序列转换为dtype对象(string),然后对转换后的序列调用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()将'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
lsmd5eda

lsmd5eda2#

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

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

ycggw6v23#

循环是非常慢的,而不是使用apply函数到每一个和一行中的单元格,尝试获得一个列表中的列名,然后循环列的列表,将每一列的文本转换为小写。
下面的代码是向量操作,比apply函数快。

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

irtuqstp4#

由于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

两种答案在小 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


在一个大的 Dataframe 上,我的答案稍微快一些。

vvppvyoh

vvppvyoh5#

试试这个

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

wswtfjt76#

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

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

dsekswqp7#

如果要保留数据类型或仅更改一种类型,请尝试,如果:

for x in dados.columns:
    if dados[x].dtype == 'object':
        print('object - allow upper')
        dados[x] = dados[x].str.upper()
    else:
        print('other? - not allow upper')
        dados[x] = dados[x].str.upper()
ogq8wdun

ogq8wdun8#

你可以把它应用于每一个cols...
oh_df.列=Map(字符串下限,oh_df.列)

相关问题