Найти строку в пандах, содержащую правильное значение для столбца - PullRequest
1 голос
/ 15 октября 2019

Один из моих столбцов в pandas df содержит строку, представляющую набор

tables,n_estimators,min_samples_split,min_samples_leaf,max_depth
"{'school.csv'}",1024,16,4,8
"{'school.csv', 'univeristy.csv', 'work'}",1024,32,4,16
"{'univeristy.csv'}",1024,4,4,16

Я пытаюсь найти строку, соответствующую определенному значению набора, следующим образом:

hp_row = hp_df.loc[set(eval(hp_df['tables'].to_numpy())) == {school.csv'}]

Но это явно не работает.

ValueError: source code string cannot contain null bytes

Любая помощь о том, как сделать это правильно?

Здесь ожидаемое значение hp_row будет

"{'school.csv'}",1024,16,4,8

Обратите внимание, что яхочу сравнивать заданные объекты, а не строки.

Спасибо

РЕДАКТИРОВАТЬ: Мое временное решение (но ищу что-то более компактное и оптимизированное):

for i in range(df.shape[0]):
    row = df.iloc[i]
    s = set(eval(row['tables']))
    if s == {"school.csv"}:
        selected_row = row

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

IIUC, вы можете использовать ast.literal_eval для преобразования столбцов table из строк в наборы и присвоить его s. Затем используйте loc с s, чтобы нарезать

import ast

s = df.tables.apply(ast.literal_eval)
df.loc[s == {'school.csv'}]

Out[109]:
           tables  n_estimators  min_samples_split  min_samples_leaf  \
0  {'school.csv'}          1024                 16                 4

   max_depth
0          8
0 голосов
/ 15 октября 2019

в случае, если вы хотите нарезать строку с набором, который содержит элемент require:

hp_df[hp_df.apply(lambda row: 'school.csv' in eval(row['tables']),axis=1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...