将 Pandas 数据框中的十六进制字符串列转换为整数。

22

我有一个非常大的数据框,我想要避免迭代每一行并将整个列从十六进制字符串转换为整数。使用astype无法正确处理字符串,但单个条目却没有问题。有没有办法告诉astype数据类型是十六进制?

IN:
import pandas as pd
df = pd.DataFrame(['1C8','0C3'], columns=['Command0'])
df['Command0'].astype(int)
OUT:
ValueError: invalid literal for int() with base10: '1C8'

这个方法可行,但希望避免对每行进行迭代操作。

for index, row in df.iterrows():
    print(row['Command0'])

我从CSV中读取数据:pd.read_csv(open_csv, nrows=20),如果有一种方法可以显式地告诉它数据格式,那就更好了!

3个回答

20
你可以按照@Andrew的解决方案使用apply,但不需要使用lambda,因为它会增加开销。相反,使用带有关键字参数的apply
res = df['Command0'].apply(int, base=16)

print(res)

0    456
1    195
Name: Command0, dtype: int64

使用pd.read_csv时,您可以使用functools.partial

from functools import partial

df = pd.read_csv(open_csv, nrows=20, converters={'Command0': partial(int, base=16)})

15

你可以使用 apply 方法。

df.Command0.apply(lambda x: int(x, 16))
>>>
0    456
1    195
Name: Command0, dtype: int64

你可以使用pd.read_csv函数并设置converters参数来实现这一点:

df = pd.read_csv("path.txt", converters={"Command0": lambda x: int(x, 16)})

2
谢谢你的回答。我也发现只要在转换器中明确告诉它基数,就不需要应用“0x”。df = pd.read_csv(open_csv, nrows=20, converters = {'Command0': lambda x: int(x,16)}) - kaminsknator

2
反向操作(浮点数转十六进制不损失转换)如下: df ['Command0'] .apply(float.hex)

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