当 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
我是 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