当 pandas 数据框中的列已经有一些大写值时,如何将其更改为大写?

How to change a column in pandas dataframe to uppercase when it already has some uppercase values?

我是 Python 和 Whosebug 的新手。

我正在尝试转换数据框 use_ab 列中的一些值:

这是我的专栏的样子:

df['use_ab'].value_counts()

False    534167
FALSE     15222
True      12724
TRUE       1023

我想做的是将所有值转换为大写。

我试过这段代码:

df['use_ab'] = df['use_ab'].str.upper()

它将“True”和“False”转换为大写字母,其余为 NaN 值,并给出以下输出:

FALSE    15222
TRUE      1023

请帮助我将此列转换为大写。

假设第一列header为'use_ab'

,您可以更改第一列的数据类型以便执行此类操作
df['use_ab'] = df['use_ab'].astype(str)

现在那些 boolean 的类型值将变成 string,现在你可以

df['use_ab'] = df['use_ab'].str.upper()

你有一个字符串和布尔值的混合列(也许还有其他一些东西),它的dtype几乎肯定是'object' - 你应该检查一下,请确认。

解决方案:您可以(并且应该)在读入时指定有问题的列的数据类型,并在读取时指定所有真值和假值:

pd.read_csv(..., dtype={'use_ab': bool}),
    true_values=['TRUE','True',True], false_values=['FALSE','False',False])

请特别注意 string 'False' 和 bool False 不是一回事! 并且尝试使用 .str 不会转换 bools

回复:df.dtypes。您列的 dtype 似乎不是字符串,但似乎也不是布尔值,因为字符串访问器 .str.upper() 丢弃了大部分 'False' 值,因为 value_counts()证明。

此外,由于您的系列显然有 NaN,您需要计算它们没有被错误处理,使用 .value_counts(..., dropna=False) 来包含它们。

import pandas as pd
import numpy as np

df = pd.Series(['True',np.nan,'FALSE','TRUE',np.nan,'False',False,True,True])

# Now note that the dtype is automatically assigned to pandas 'object'!
>>> df.dtype
dtype('O')

>>> df.value_counts(dropna=False)
True     2
NaN      2
FALSE    1
TRUE     1
True     1
False    1
False    1
dtype: int64

看看 错误地尝试在此混合列上使用 .str.upper() 访问器是如何破坏那些实际上是布尔值的值 ,同时对字符串进行大小写转换:

>>> df.str.upper()
0     TRUE
1      NaN
2    FALSE
3     TRUE
4      NaN
5    FALSE
6      NaN  <-- bool True coerced to NaN!
7      NaN  <-- bool False coerced to NaN!
8      NaN  <-- bool False coerced to NaN!
dtype: object

根据您希望此列的类型是 bool(ean) 还是 str,您可以这样做

In [1]: import pandas as pd

In [2]: df = pd.DataFrame.from_dict({'use_ab': [False] * 534167 + ['FALSE'] * 15222 + [True] * 12724 + ['TRUE'] * 1023})

# get boolean series
In [3]: df['use_ab'].astype(bool)
Out[3]:
0         False
1         False
2         False
3         False
4         False
          ...
563131     True
563132     True
563133     True
563134     True
563135     True
Name: use_ab, Length: 563136, dtype: bool

# get string series
In [4]: df['use_ab'].astype(str).str.upper()
Out[4]:
0         FALSE
1         FALSE
2         FALSE
3         FALSE
4         FALSE
          ...
563131     TRUE
563132     TRUE
563133     TRUE
563134     TRUE
563135     TRUE
Name: use_ab, Length: 563136, dtype: object