我有一个非常大的数据框,我想避免遍历每一行,并希望将整个列从十六进制字符串转换为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'
这样可行但希望避免行迭代。
for index, row in df.iterrows():
print(row['Command0'])
我正在通过CSV pd.read_csv(open_csv, nrows=20)
阅读此内容,因此,如果有办法将其读入并明确告诉它格式是什么,那就更好了!
答案 0 :(得分:7)
您可以使用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)})
答案 1 :(得分:2)
您可以按照@Andrew's solution使用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)})