将pandas dataframe列从十六进制字符串转换为int

kam*_*tor 8 python hex dataframe python-3.x pandas

我有一个非常大的数据框,我想避免遍历每一行,并希望将整个列从十六进制字符串转换为int.它不会使用astype正确处理字符串,但单个条目没有问题.有没有办法告诉astype数据类型是16?

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'
Run Code Online (Sandbox Code Playgroud)

这有效,但希望避免行迭代.

for index, row in df.iterrows():
    print(row['Command0'])
Run Code Online (Sandbox Code Playgroud)

我正在从CSV中读取这个内容,pd.read_csv(open_csv, nrows=20)所以如果有办法读取它并明确告诉它格式是什么,那就更好了!

and*_*rew 8

你可以用apply.

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

您可以pd.read_csv使用converters参数调用来执行此操作:

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

  • 谢谢你的回答.我还发现,只要你明确告诉它在转换器情况下的基础,你就不需要应用'0x'.`df = pd.read_csv(open_csv,nrows = 20,converters = {'Command0':lambda x:int(x,16)})` (2认同)

jpp*_*jpp 5

您可以apply按照@Andrew的解决方案使用,但这lambda不是必需的,并且会增加开销。而是使用apply关键字参数:

res = df['Command0'].apply(int, base=16)

print(res)

0    456
1    195
Name: Command0, dtype: int64
Run Code Online (Sandbox Code Playgroud)

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

from functools import partial

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