gpt4 book ai didi

python - 相当于 pandas to_numeric() 的 bool 值

转载 作者:行者123 更新时间:2023-11-28 19:33:12 29 4
gpt4 key购买 nike

我正在寻找 pandas to_numeric() 的 bool 等价物我希望该函数尽可能将列转换为 True/False/nan,否则抛出错误。

我的动机是我需要自动识别和转换具有约 1000 列的数据集中的 bool 列。我可以使用以下代码对 float /整数做类似的事情:

df = df_raw.apply(pd.to_numeric, errors='ignore')

最佳答案

由于 pd.to_numeric 主要用于将字符串转换为数值,因此我假设您要转换文字 bool 值的字符串。

考虑数据框 df

df = pd.DataFrame([
['1', None, 'True'],
['False', 2, True]
])

print(df)

0 1 2
0 1 NaN True
1 False 2.0 True

我的选择
这就是我的建议。在下面,我将其分解以试图解释发生了什么。

def try_eval2(x):
if type(x) is str:
try:
x = literal_eval(x)
except:
x = np.nan

if type(x) is not bool:
x = np.nan

return x

vals = df.values
v = vals.ravel()
a = np.array([try_eval2(x) for x in v.tolist()], dtype=object)
pd.DataFrame(a.reshape(vals.shape), df.index, df.columns)

0 1 2
0 NaN NaN True
1 False NaN True

时机
您会注意到我提出的解决方案非常快

%%timeit
vals = df.values
v = vals.ravel()
a = np.array([try_eval2(x) for x in v.tolist()], dtype=object)
pd.DataFrame(a.reshape(vals.shape), df.index, df.columns)
10000 loops, best of 3: 149 µs per loop

%timeit df.astype(str).applymap(to_boolean)
1000 loops, best of 3: 1.28 ms per loop

%timeit df.astype(str).stack().map({'True':True, 'False':False}).unstack()
1000 loops, best of 3: 1.27 ms per loop

说明

第一步
现在我将创建一个使用 ast.literal_eval 将字符串转换为值的简单函数

from ast import literal_eval

def try_eval(x):
try:
x = literal_eval(x)
except:
pass
return x

第 2 步
applymap 与我的新功能。它看起来会一样!

d1 = df.applymap(try_eval)
print(d1)

0 1 2
0 1 NaN True
1 False 2.0 True

第 3 步
再次使用 whereapplymap 来查找值实际上是 bool

d2 = d1.where(d1.applymap(type).eq(bool))
print(d2)

0 1 2
0 NaN NaN True
1 False NaN True

第四步
您可以删除所有 NaN

的列
print(d2.dropna(1, 'all'))

0 2
0 NaN True
1 False True

关于python - 相当于 pandas to_numeric() 的 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43789621/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com