Несколько вставок в NumPy, где парные элементы не имеют подтекст - PullRequest
0 голосов
/ 02 марта 2019

Этот вопрос следует за предыдущим сообщением , на который ответил @ecortazar.Тем не менее, я также хотел бы вставить между двумя элементами в pd.Series, которые не включают определенную строку, используя только Pandas / Numpy.Примечание: все строки с href в тексте отличаются.

import pandas as pd
import numpy as np

table = pd.Series(

        ["<td class='test'>AA</td>",                  # 0 
        "<td class='test'>A</td>",                    # 1
        "<td class='test'><a class='test' href=...",  # 2
        "<td class='test'>B</td>",                    # 3
        "<td class='test'><a class='test' href=...",  # 4
        "<td class='test'>BB</td>",                   # 5
        "<td class='test'>C</td>",                    # 6
        "<td class='test'><a class='test' href=...",  # 7 
        "<td class='test'>F</td>",                    # 8
        "<td class='test'>G</td>",                    # 9 
        "<td class='test'><a class='test' href=...",  # 10 
        "<td class='test'>X</td>"])                   # 11


dups = ~table.str.contains('href') & table.shift(-1).str.contains('href') 
array = np.insert(table.values, dups[dups].index, "None")
pd.Series(array)


# OUTPUT:
# 0                      <td class='test'>AA</td>
# 1                                          None
# 2                       <td class='test'>A</td>
# 3     <td class='test'><a class='test' href=...
# 4                                          None Incorrect
# 5                       <td class='test'>B</td>
# 6     <td class='test'><a class='test' href=...
# 7                      <td class='test'>BB</td>
# 8                                          None
# 9                       <td class='test'>C</td>
# 10    <td class='test'><a class='test' href=...
# 11                      <td class='test'>F</td>
# 12                                         None
# 13                      <td class='test'>G</td>
# 14    <td class='test'><a class='test' href=...
# 15                      <td class='test'>X</td>

Вот фактический текстовый вывод, который я хотел бы.

# OUTPUT:
# 0                      <td class='test'>AA</td>
# 1                                          None
# 2                       <td class='test'>A</td>
# 3     <td class='test'><a class='test' href=...
# 4                       <td class='test'>B</td>
# 5     <td class='test'><a class='test' href=...
# 6                      <td class='test'>BB</td>
# 7                                          None
# 8                       <td class='test'>C</td>
# 9     <td class='test'><a class='test' href=...
# 10                      <td class='test'>F</td>
# 11                                         None
# 12                      <td class='test'>G</td>
# 13    <td class='test'><a class='test' href=...
# 14                      <td class='test'>X</td>

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Вы можете сделать ту же процедуру, что и раньше.

Единственное предостережение в том, что вы должны сделать оператор not (~) перед сдвигом.Причина в том, что сдвиг создаст np.nan в первой позиции вашей Серии, которая определит Серию как поплавки, что приведет к сбою в операции not.

import pandas as pd
import numpy as np

table = pd.Series(
        ["<td class='test'>AA</td>",                  # 0 
        "<td class='test'>A</td>",                    # 1
        "<td class='test'><a class='test' href=...",  # 2
        "<td class='test'>B</td>",                    # 3
        "<td class='test'><a class='test' href=...",  # 4
        "<td class='test'>BB</td>",                   # 5
        "<td class='test'>C</td>",                    # 6
        "<td class='test'><a class='test' href=...",  # 7 
        "<td class='test'>F</td>",                    # 8
        "<td class='test'>G</td>",                    # 9 
        "<td class='test'><a class='test' href=...",  # 10 
        "<td class='test'>X</td>"])                   # 11


not_contain = ~table.str.contains('href')
cond = not_contain & not_contain.shift(1)
array = np.insert(table.values, cond[cond].index, "None")
pd.Series(array)
0 голосов
/ 02 марта 2019

Это решает все вышеперечисленное, но без Numpy и Pandas.Если вы сможете воссоздать их, я дам вам правильный ответ.

import pandas as pd
import numpy as np

table = pd.Series(

        ["<td class='test'>AA</td>",                  # 0 
        "<td class='test'>A</td>",                    # 1
        "<td class='test'><a class='test' href=...",  # 2
        "<td class='test'>B</td>",                    # 3
        "<td class='test'><a class='test' href=...",  # 4
        "<td class='test'>BB</td>",                   # 5
        "<td class='test'>C</td>",                    # 6
        "<td class='test'><a class='test' href=...",  # 7 
        "<td class='test'>F</td>",                    # 8
        "<td class='test'>G</td>",                    # 9 
        "<td class='test'><a class='test' href=...",  # 10 
        "<td class='test'>X</td>"])                   # 11


insertAt = []
for i in range(0, len(table)-1):
  # print('count ', i)

  if i == 1:
    if 'href' not in table[0] and 'href' not in table[1]:
      print(i, ' starts with tag')
      print(i, ' is duplicated')
      insertAt.append(True) 
      insertAt.append(True) 
      next
    elif 'href' not in table[0] and 'href' in table[1]:
      print(i, ' not start with tag')
      print(i, ' is not duplicated')
      insertAt.append(True) 
      insertAt.append(False) 
      next

    else:
      print(i, ' not start with tag')
      print(i, ' is not duplicated')
      insertAt.append(False) 
      insertAt.append(False) 
      next

  if i > 1:

    if 'href' not in table[i-1] and 'href' not in table[i]: 
      print(i + 1, ' is duplicated')
      insertAt.append(True)

    else:
      print(i + 1, ' is not duplicated')
      insertAt.append(False)

insertAt = pd.Series(insertAt)
array = np.insert(table.values, insertAt[insertAt].index, "None")
pd.Series(array) # back to series if necessary
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...