Запрос Pandas для строкового литерала в байтах в Linux приводит к ошибке атрибута… нет атрибута ‘visit_Bytes’

#python #linux #pandas

#python #linux #pandas

Вопрос:

Я пытаюсь написать запрос pandas для строкового литерала байта. Это нормально работает в Windows, но я получаю исключение в Red Hat Ent. Linux. Вот код:

 import pandas as pd

df = pd.DataFrame([[1, 2, b'3'], [4, 5, b'6'], [7, 8, b'9']],
              columns=['num1', 'num2', 'byteStr'])
print(df)
print()
df_qnum = df.query("num1 == 1")
print(df_qnum)
print()
df_qstr = df.query("byteStr == b'6'")
print(df_qstr)
 

Результаты Windows:

    num1  num2 byteStr
   0     1     2    b'3'
   1     4     5    b'6'
   2     7     8    b'9'

   num1  num2 byteStr
   0     1     2    b'3'

   num1  num2 byteStr
   1     4     5    b'6'
 

Результаты Linux:

    num1  num2 byteStr
   0     1     2    b'3'
   1     4     5    b'6'
   2     7     8    b'9'

   num1  num2 byteStr
   0     1     2    b'3'

   Traceback (most recent call last):
   File "pandasTest.py", line 10, in <module>
     df_qstr = df.query("byteStr == b'6'")
   File "/usr/local/lib64/python3.6/site-packages/pandas/core/frame.py", line 3231, in query
     res = self.eval(expr, **kwargs)
   ...
   File "/usr/local/lib64/python3.6/site-packages/pandas/core/computation/expr.py", line 374, in    visit
     visitor = getattr(self, method)
   AttributeError: 'PandasExprVisitor' object has no attribute 'visit_Bytes'
 

Как я могу заставить этот запрос работать в Linux? Пробовал на Python3 и Pandas 1.0.1 и 1.1.4.

Ответ №1:

Вы всегда можете декодировать byte objects до буквальных строк, а затем query , например:

 In [4516]: df.byteStr = df.byteStr.str.decode("utf-8")

In [4517]: df
Out[4517]: 
   num1  num2 byteStr
0     1     2       3
1     4     5       6
2     7     8       9

In [4519]: df.query("byteStr == '6'")
Out[4519]: 
   num1  num2 byteStr
1     4     5       6
 

Комментарии:

1. Я бы хотел избежать преобразования, поскольку оно выполняется для широкого спектра файлов HDF5, а некоторые наборы данных довольно большие, и для запуска требуется некоторое время. В идеале я могу просто запросить как есть. Мне нужно будет провести несколько экспериментов, чтобы увидеть, какое влияние оказывает общее решение.