Установите отношения родитель-ребенок, используя вложенные циклы между двумя рядами в кадре данных Pandas - PullRequest
0 голосов
/ 08 июня 2018

Позвольте мне начать с главной цели, которую я пытаюсь достичь.У меня есть набор чисел, состоящий из 14 цифр в базе данных из двух наборов категорий (Поставить под «Hier») Родитель или потомок, например, 60814703140000: Родитель, если последние 4 цифры содержат число, например, 60814703140100: дочерний. введите описание изображения здесь

Я пытаюсь разработать алгоритм в Pandas Python, который знает, как группировать родителей с последующими детьми, основываясь на том факте, что родитель / ребенок делят первые 10цифры.

Мой мыслительный процесс заключался в следующем: извлечь два вектора из базы данных pandas:

Par=Newdf[Newdf['Hier']=='Parent']
Chi=Newdf[Newdf['Hier']=='Child']

И затем выполнить итерацию по двум сериям, используя вложенный цикл for: Если первые 10 цифр элемента вPar равняется первым 10 цифрам в элементе Chi: затем они принадлежат к одному семейству и добавляют их в мой список таким образом, чтобы он давал список связанного родительского дочернего элемента: [(60814703140000,60814703140100), (60814702350000,60814702350200), (60814711630000,60814711630500), .....]

mat = []

for i in Par['UWI']:
   for j in Chi['UWI']:
      if str(i)[0:9] == str(j)[0:9]:   
        mat.append(str(i),str(j))

mat

Этот код, однако, выдает ошибку, поскольку у меня возникает проблема с добавлением нескольких элементов в список одновременно.

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-51-8b0ab9fd7ce5> in <module>()
      7    for j in Chi['UWI']:
      8       if str(i)[0:9] == str(j)[0:9]:
----> 9         mat.append(str(i),str(j))
     10 
     11 mat

TypeError: append () принимает ровно один аргумент (задано 2)

Мой вопрос:

1.Какой правильный синтаксис для добавления ассоциированного родителя-детские отношения

2. Родительские дочерние отношения не являются 1: 1, так как у меня может быть более одного ребенка на одного родителя, и я хотел бы также включить их.

3. Есть ли лучший способ сделать это?Например, я знаю, что могу использовать понимание списка, но я не понял это правильно из-за добавленного оператора if.Итак, «Как бы я использовал понимание списка с двумя циклами for и оператором if

Я ценю любую другую критику или предложения по улучшению этого кода.

Ссылка на пример данных

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Отвечая на комментарий новым ответом:

Я думаю, как вы смотрите на это, было бы лучше, вместо списка использовать словарь, таким образом, вы можете хранить 2элементы в тех же параметрах.

mat = {}


for i in Par['UWI']:
    for j in Chi['UWI']:
         if str(i)[0:9] == str(j)[0:9]:   
              mat.update({str(i):str(j)})

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

0 голосов
/ 09 июня 2018

Как говорится, ему не нравятся 2 аргумента - в этом случае добавление в список сразу 2 строк.

mat.append(str(i))
mat.append(str(j))

Возможно, стоит добавить try и exceptв (Google, если вы застряли), чтобы сделать код более надежным - так что, если некоторые недействительные данные попадут в базу данных, программа не потерпит крах, но сделайте то, что вы хотите, чтобы она делала.

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