Как вписать переменную в запрос?

Есть большой CSV (~1000 строк данных, 13 столбцов). Загружаю его в DataFrame (cur_stat) и пытаюсь фильтровать:

curSubOrd = cur_stat.head(50)[['subordination']].values[0]

Фильтрую:

tmp = cur_stat.loc[cur_stat['id'] == curSubOrd, ['name']]
print("curSubOrd = <"+str(tmp.values[0])+">")

ValueError: ('Lengths must match to compare', (117,), (1,)).

Указывает на строку loc:

tmp = cur_stat.query("id == @curSubOrd")
print("curSubOrd = <"+str(tmp.values[0])+">")

ValueError: ('Lengths must match to compare', (117,), (1,)).

Указывает на строку query:

tmp = cur_stat[cur_stat['id'] == 556078]['name']
print("curSubOrd = <"+str(tmp.values[0])+">")

Работает.

tmp = cur_stat.query("id == 556078")['name']
print("curSubOrd = <"+str(tmp.values[0])+">")

Работает.


PS pandas 1.1.2 python 3.8.5


Ответы (1 шт):

Автор решения: MaxU

Значение в переменной curSubOrd - должно быть скаляром, а у вас вектор, состоящий из одного элемента размерности (1, ). Сравнивать значения столбца можно либо с вектором той же размерности либо со скаляром.

Воспроизведение:

In [196]: df = pd.DataFrame({"a":[1,2,3], "b":[4,5,6]}, index=list("abc"))

In [197]: df
Out[197]:
   a  b
a  1  4
b  2  5
c  3  6

In [198]: var = df.head(2)[["a"]].values[0]

In [199]: var
Out[199]: array([1])

In [200]: var.shape
Out[200]: (1,)

Попробуйте так:

In [202]: var = df.loc[df.index[1], "b"]

In [203]: var
Out[203]: 5

In [204]: df.query("b == @var")
Out[204]:
   a  b
b  2  5

или в вашем случае:

curSubOrd = cur_stat.loc[cur_stat.index[0], "subordination"]
→ Ссылка