Фильтровать панды данных, у которых есть массивы в ячейках - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть кадр данных Pandas со столбцом 'htgt', этот столбец состоит из массива с числами внутри. Размер массива не постоянен. Пример данных:

11                  [16, 69]
12                  [61, 79]
13                  [10, 69]
14                      [81]
15          [12, 30, 45, 68]
16                  [10, 76]
17                   [9, 39]
18              [67, 69, 77]

Как я могу отфильтровать все строки, например, с номером 10.

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Не храните тип list в столбцах pandas, это неэффективно, и это затруднит взаимодействие с вашими данными. Просто разверните ваши списки по столбцам:

out = pd.DataFrame(df.htgt.values.tolist())

    0     1     2     3
0  16  69.0   NaN   NaN
1  61  79.0   NaN   NaN
2  10  69.0   NaN   NaN
3  81   NaN   NaN   NaN
4  12  30.0  45.0  68.0
5  10  76.0   NaN   NaN
6   9  39.0   NaN   NaN
7  67  69.0  77.0   NaN

Теперь вы можете использовать эффективные pandas операции для поиска строк с 10:

out.loc[out.eq(10).any(1)]

    0     1   2   3
2  10  69.0 NaN NaN
5  10  76.0 NaN NaN

Если вы настаиваете на результате, находящемся в форме list, вы можете использовать stack и agg:

out.loc[out.eq(10).any(1)].stack().groupby(level=0).agg(list)

2    [10.0, 69.0]
5    [10.0, 76.0]
dtype: object
0 голосов
/ 08 сентября 2018
def check(list):
    return '10' in list

df[df['B'].astype(list).apply(check)]

Выход:

    A   B
2   13  [10, 69]
5   16  [10, 76]
0 голосов
/ 08 сентября 2018

Вы могли бы сделать это, сначала создав логический индекс, используя понимание списка:

mask = [(10 in x) for x in df['htgt']]
df[mask]

Или одна строка, если вы предпочитаете:

df.loc[[(10 in x) for x in df['htgt']]]

[выход]

htgt
13  [10, 69]
16  [10, 76]
...