Удалить строку из таблицы астропии - PullRequest
0 голосов
/ 28 февраля 2020

Я хотел бы удалить строки, содержащие инфы, из таблицы астропии. Что-то вроде следующего

for line in mytable:
    if float('inf') in line:
        mytable.remove(line)

за исключением того, что я не знаю, что использовать для функции remove.

В документации говорится, как удалить столбец, но не как удалить строку.

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Это немного быстрее, чем ваш ответ , особенно с ростом размера таблицы.

Здесь мы создаем маску всех строк, которые содержат inf, или собирая вместе маски для каждого столбца, затем нарезать полную таблицу всего один раз:

>>> table = Table({'a': [1, 2, 3], 'b': [1.0, np.inf, 3.0], 'c': [np.inf, 2.0, 3.0]})
>>> mask = np.logical_or.reduce([c == np.inf for c in table.columns.values()])
>>> table = table[~mask]
>>> table
<Table length=1>
  a      b       c
int64 float64 float64
----- ------- -------
    3     3.0     3.0

То, что мы делаем в обоих случаях, на самом деле не само по себе «удаление строк», потому что мы не изменяем оригинальный стол. Скорее, мы создаем новую таблицу как копию исходной таблицы, с некоторыми пропущенными строками. Так что делать это по-своему медленнее, потому что для каждого столбца необходимо создать новую копию таблицы, тогда как сначала создание маски, а затем индексация делает копию только один раз, независимо от количества столбцов:

In [24]: %%timeit
    ...: table2 = table
    ...: for col in table.colnames:
    ...:     table2 = table2[table2[col] != float('inf')]
    ...:
327 µs ± 40.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [25]: %%timeit
    ...: mask = np.logical_or.reduce([c == np.inf for c in table.columns.values()])
    ...: table2 = table[~mask]
    ...:
    ...:
121 µs ± 7.84 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Я подозреваю, что разница еще более драматична c для большего количества столбцов и / или строк.

В зависимости от вашего варианта использования, вы можете также рассмотреть создание маскированной таблицы с масками для каждого столбца. Это позволяет избежать удаления данных из таблицы, все еще выполняя над ней арифметические операции c, которые игнорируют единичные значения:

>>> table = Table({'a': [1, 2, 3], 'b': [1.0, np.inf, 3.0], 'c': [np.inf, 2.0, 3.0]}, masked=True)
>>> for col in table.columns.values():
...     col.mask = (col == np.inf)
...
>>> table
<Table masked=True length=3>
  a      b       c
int64 float64 float64
----- ------- -------
    1     1.0      --
    2      --     2.0
    3     3.0     3.0
>>> table['b'].mean()
2.0
0 голосов
/ 28 февраля 2020

Кажется, что работает следующее

for col in mytable.colnames:
    mytable = mytable[mytable[col] != float('inf')]
...