问题描述
我是 Python 和 StackOverflow 的新手。
我正在尝试转换数据框 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
请帮我将此列转换为大写。
解决方法
你有一个字符串和布尔值的混合列(也许还有其他一些东西),而且它的 dtype
几乎肯定是“对象” - 你应该检查一下,请确认。
解决方案:您可以(并且应该)在读取时指定有问题的列的 dtype,还可以在读取时指定所有 true 和 false 值:
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' 值,如 {{1} } 证明。
此外,由于您的系列显然包含 NaN,并且您需要计算它们没有被错误处理,因此请使用 value_counts()
来包含它们。
.value_counts(...,dropna=False)
看看如何错误地尝试在这个混合列上使用 import pandas as pd
import numpy as np
df = pd.Series(['True',np.nan,'FALSE','TRUE',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
访问器会破坏那些实际上是 bool 的值,同时对字符串进行大小写转换:
.str.upper()
,
根据您希望此列的类型为 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,dtype: object
,
您可以更改第一列中的数据类型,以便执行此类操作,假设第一列标题为“use_ab”
df['use_ab'] = df['use_ab'].astype(str)
现在那些布尔类型的值将变成字符串,现在你可以
df['use_ab'] = df['use_ab'].str.upper()