2016-05-08 3 views
1

У меня есть столбец типа numpy.ndarray, который выглядит как:Извлечение непустых значений из регулярных выражений вывода массива в Python

  col 
    ['','','5',''] 
    ['','8'] 
    ['6','',''] 
    ['7'] 
    [] 
    ['5'] 

Я хочу Ouput так:

  col 
      5 
      8 
      6 
      7 
      0 
      5 

Как могу ли я сделать это в python. Любая помощь очень ценится.

+0

Как насчет '['']' и '['5', '6']'? –

+0

В моем случае у меня есть только одна непустая запись. Но в таких случаях можно получить максимум из списка. В этом случае ['5', '6'] должен дать мне 6. спасибо – user4349490

ответ

2

Для преобразования данных в числовые значения, которые вы могли бы использовать:

import numpy as np 
import pandas as pd 
data = list(map(np.array, [ ['','','5',''], ['','8'], ['6','',''], ['7'], [], ['5']])) 
df = pd.DataFrame({'col': data}) 
df['col'] = pd.to_numeric(df['col'].str.join('')).fillna(0).astype(int) 
print(df) 

дает

col 
0 5 
1 8 
2 6 
3 7 
4 0 
5 5 

Для преобразования данных в строки использования:

df['col'] = df['col'].str.join('').replace('', '0') 

Результат выглядит одинаково, но dtype colu mn равно object, так как значения являются строками.


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

import numpy as np 
import pandas as pd 
data = list(map(np.array, [ ['','','5','6'], ['','8'], ['6','',''], ['7'], [], ['5']])) 
df = pd.DataFrame({'col': data}) 
df['col'] = [max([int(xi) if xi else 0 for xi in x] or [0]) for x in df['col']] 
print(df) 

дает

col 
0 6 # <-- note ['','','5','6'] was converted to 6 
1 8 
2 6 
3 7 
4 0 
5 5 

Для версий панд до 0,17, вы могли бы использовать вместо df.convert_objects:

import numpy as np 
import pandas as pd 
data = list(map(np.array, [ ['','','5',''], ['','8'], ['6','',''], ['7'], [], ['5']])) 
df = pd.DataFrame({'col': data}) 
df['col'] = df['col'].str.join('').replace('', '0') 
df = df.convert_objects(convert_numeric=True) 
+0

Зачем вам нужен 'data = list (map (np.array, ...'? Это может быть просто 'data = np.array (...) ' –

+0

Я получаю объект AttributeError: 'module' не имеет атрибута 'to_numeric'". Как обойти это. Спасибо – user4349490

+0

@JoeR: Если вы определяете 'data' как массив объектов NumPy, тогда' df = pd.DataFrame (data) 'будет делать списки значений, а не массивы NumPy. Так как OP сказал« столбец типа numpy.ndarray «Я попытался придерживаться этой спецификации (на всякий случай это имеет значение, хотя я не думаю, что это так). – unutbu

0

Я оставлю вас с этим:

>>> l=['', '5', '', ''] 
>>> l = [x for x in l if not len(x) == 0] 
>>> l 
>>> ['5'] 

Вы можете сделать то же самое с помощью лямбда и фильтр

>>> l 
['', '1', ''] 
>>> l = filter(lambda x: not len(x)==0, l) 
>>> l 
['1'] 

Следующим шагом будет итерация по строкам массива и реализация одной из этих двух идей.

Кто-то показывает, как это делается здесь: Iterating over Numpy matrix rows to apply a function each?

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

+0

OP хотел целые числа в выходе, и у вас есть строки. –

0
 xn = array([['', '', '5', ''], ['', '8'], ['6', '', ''], ['7'], [], ['5']], 
    dtype=object) 

     In [20]: for a in x: 
    ....:  if len(a)==0: 
    ....:   print 0 
    ....:  else: 
    ....:   for b in a: 
    ....:    if b: 
    ....:     print b 
    ....: 
5 
8 
6 
7 
0 
5 
Смежные вопросы