Как разрешить или пропустить конкретную строку столбца, где мы получаем> "объект с плавающей запятой не повторяется" в str.findall - PullRequest
0 голосов
/ 16 июня 2020

Привет, я пытаюсь перебрать столбец в pandas. Я попытался заменить «i» на «[i]». Но это привело к другой ошибке. У меня есть небольшой вклад, а не весь ввод. Или также возможно, что мы можем пропустить такую ​​строку во фрейме данных, где мы получим ошибку: «объект 'float' не является итерируемым», и он продолжает повторяться в следующих строках?

Ввод:

Name    Matches
John    [1, 0, 500,], [2, 0, 600,],[70,67,78]
Wall    [4, 0, 14], [2, 0, 40]
Austin  [1, 0, 5,], [0,2, 7,]

Код:

df['any_value_greater_than_10?'] = (['yes' if any(int(a)>10 for a in i) else 'no' 
                                       for i in df['Matches'].str.findall('\d+')])

Ошибка:

for i in df['Matches'].str.findall('\d+')])
'float' object is not iterable

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

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

print (df)
     Name                                Matches
0    John  [1, 0, 500,], [2, 0, 600,],[70,67,78]
1    Wall                 [4, 0, 14], [2, 0, 40]
2  Austin                  [1, 0, 5,], [0,2, 7,]
3    Josh                                     []


print (df['Matches'].astype(str).str.findall('\d+'))
0    [1, 0, 500, 2, 0, 600, 70, 67, 78]
1                  [4, 0, 14, 2, 0, 40]
2                    [1, 0, 5, 0, 2, 7]
3                                    []
Name: Matches, dtype: object

df['any_value_greater_than_10?'] = (['yes' if any(int(a)>10 for a in i) else 'no' 
                                      for i in df['Matches'].astype(str).str.findall('\d+')])

print (df)
     Name                                Matches any_value_greater_than_10?
0    John  [1, 0, 500,], [2, 0, 600,],[70,67,78]                        yes
1    Wall                 [4, 0, 14], [2, 0, 40]                        yes
2  Austin                  [1, 0, 5,], [0,2, 7,]                         no
3    Josh                                     []                         no

Другое решение:

m = (df['Matches'].astype(str)
                  .str.extractall('(\d+)')[0]
                  .astype(float)
                  .gt(10)
                  .any(level=0)
                  .reindex(df.index, fill_value=False))

df['any_value_greater_than_10?'] = np.where(m, 'yes','no')

print (df)
     Name                                Matches any_value_greater_than_10?
0    John  [1, 0, 500,], [2, 0, 600,],[70,67,78]                        yes
1    Wall                 [4, 0, 14], [2, 0, 40]                        yes
2  Austin                  [1, 0, 5,], [0,2, 7,]                         no
3    Josh                                     []                         no

Как это работает :

После преобразования в строки используется Series.str.extractall для всех целых чисел в столбец 0:

print (df['Matches'].astype(str).str.extractall('(\d+)'))
           0
  match     
0 0        1
  1        0
  2      500
  3        2
  4        0
  5      600
  6       70
  7       67
  8       78
1 0        4
  1        0
  2       14
  3        2
  4        0
  5       40
2 0        1
  1        0
  2        5
  3        0
  4        2
  5        7

Для серии выбран столбец 0:

print (df['Matches'].astype(str).str.extractall('(\d+)')[0])
   match
0  0          1
   1          0
   2        500
   3          2
   4          0
   5        600
   6         70
   7         67
   8         78
1  0          4
   1          0
   2         14
   3          2
   4          0
   5         40
2  0          1
   1          0
   2          5
   3          0
   4          2
   5          7
Name: 0, dtype: object

Преобразовать в числа с плавающей запятой, а затем проверить на большее значение, например 10:

print (df['Matches'].astype(str)
                      .str.extractall('(\d+)')[0]
                      .astype(float)
                      .gt(10)
)
   match
0  0        False
   1        False
   2         True
   3        False
   4        False
   5         True
   6         True
   7         True
   8         True
1  0        False
   1        False
   2         True
   3        False
   4        False
   5         True
2  0        False
   1        False
   2        False
   3        False
   4        False
   5        False
Name: 0, dtype: bool

Последняя проверка, есть ли хотя бы один True на первый уровень, созданный исходные значения индекса:

print (df['Matches'].astype(str)
                      .str.extractall('(\d+)')[0]
                      .astype(float)
                      .gt(10)
                      .any(level=0))
0     True
1     True
2    False
Name: 0, dtype: bool

... и добавьте несколько несовпадающих строк, здесь последняя:

print (df['Matches'].astype(str)
                      .str.extractall('(\d+)')[0]
                      .astype(float)
                      .gt(10)
                      .any(level=0)
                      .reindex(df.index, fill_value=False))

0     True
1     True
2    False
3    False
Name: 0, dtype: bool

И последняя последняя передается в numpy.where.

0 голосов
/ 16 июня 2020

, значит ошибка была в строках, где столбец «соответствует» был пустым. отлично работает после замены пустого на 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...