使用与read_csv相同的逻辑将字符串转换为Pandas或Numpy dtype?

3

如何解析字符串,使用Pandas读取CSV时使用的相同逻辑进行转换?例如,将“False”转换为 bool 会给出False。我有用户输入的文本值需要插入到DataFrame中,它们应该自动转换为正在插入的列的dtype,使用这种逻辑。下面的示例尝试将一个值插入到布尔列中,但结果是错误的。

import pandas as pd

x = pd.DataFrame([{'id': 0, 'flag': True},
                  {'id': 1, 'flag': False},
                  {'id': 2, 'flag': True}])

text = "False"
value = x['flag'].dtype.type(text)  # Want this to be False not True
x.loc[0, 'flag'] = value
3个回答

1
使用 json.loads(),然后将flag的数据类型转换为其先前的类型。它适用于 "False""false""1""0" 等。
previous_type = x.flag.dtype
x.loc[0, 'flag'] = json.loads(text.lower())
x.flag = x.flag.astype(previous_type)

完整代码:

import pandas as pd
import json

x = pd.DataFrame([{'id': 0, 'flag': True},
                  {'id': 1, 'flag': False},
                  {'id': 2, 'flag': True}])
text = "False"
previous_type = x.flag.dtype
x.loc[0, 'flag'] = json.loads(text.lower())
x.flag = x.flag.astype(previous_type)
print(x)

    id  flag
0   0   False
1   1   False
2   2   True

这与我问题中的代码片段存在相同的问题,第一行的值最终变成了 True 而不是 False - pyjamas
修改了我的回答。现在请查看。 - Hamza usman ghani
1
谢谢!我喜欢JSON的想法。我考虑过eval,但它不像read_csv背后的逻辑那样宽容,因为大小写很重要,所以"false"会失败,其他dtypes也有类似的注意事项。在json示例中,您可能需要编辑的一个小问题是,在json.loads之后仍然需要转换为正确的dtype,例如,如果用户文本为"0",则json.loads将其转换为0,但仍需要将其转换为False - pyjamas
是的,在这种情况下需要将其转换回先前的类型。 - Hamza usman ghani

0
请记住,在Python中
>>bool("faa")
True
>>bool("True")
True
>>bool("False")
True
>>bool("")
False

所以在你的情况下,

import pandas as pd

x = pd.DataFrame([{'id': 0, 'flag': True},
                  {'id': 1, 'flag': False},
                  {'id': 2, 'flag': True}])

text = bool("")
value = x['flag'].dtype.type(text)  # Want this to be False not True
print(value) // False
x.loc[0, 'flag'] = value

应该做

另一个解决方案可能是

import pandas as pd

x = pd.DataFrame([{'id': 0, 'flag': True},
                  {'id': 1, 'flag': False},
                  {'id': 2, 'flag': True}])

text = "False"
value = x['flag'].dtype.type(eval(text))  # Want this to be False not True
print(value) // False
x.loc[0, 'flag'] = value


改变“text”的值对我来说不是可行的解决方案,因为“text”是用户输入的。用户在显示类似于Excel电子表格的DataFrame的GUI中输入值,而DataFrame需要更新该值。让用户通过提交空单元格来输入“False”将会导致糟糕的用户体验,它需要像修改CSV文件一样运作,这就是为什么我正在寻找如何应用“read_csv”背后的逻辑的原因。 - pyjamas
好的。我有另一种解决方案,虽然可能不符合你的口味,但如果你使用 eval(text),你可以得到你想要的输出。我已经编辑了我的答案。 - Sifat Amin
另外,我不确定您是否可以在定义用户输入类型时使用转换器。 - Sifat Amin

0

这里是一个可行的解决方法,但性能可能不太好。

from io import StringIO
import pandas as pd
value = pd.read_csv(StringIO(text), dtype=column_dtype, header=None).values[0][0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接