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

У меня есть первый дата-кадр, к которому я должен добавить строки второй дата-кадр.

Этот более или менее похож на первый:

    QID    Questions    B   Answer1 Answer2 Answer3 F G H I J
0   3   a   4.0 a   a   a   a   e   g   i   l    
1   4   b   5.0 b   b   b   a   r   h   m   p
2   5   d   5.0 NaN e   d   b   u   e   i   z
3   6   e   5.0 d   h   r   b   c   z   i   3
...

И второе:

    QID    Questions    B   Answer1 Answer2 Answer3 F ...
0   1   a   4.0 a   a   a   a   
1   2   b   5.0 b   k   b   a   
2   2_1 z   5.0 b   k   b   a   
3   2_2 w   4.0 b   k   b   c   
4   3   d   5.0 NaN e   d   b   
5   4   e   5.0 d   h   r   b   
...

Я бы хотел получить:

    QID    Questions    B   Answer1 Answer2 Answer3 F G H I J
0   3   a   4.0 a   a   a   a   e   g   i   l    
1   4   b   5.0 b   b   b   a   r   h   m   p
2   4_1 z   5.0 b   k   b   a   r   h   m   p
3   4_2 w   4.0 b   k   b   c   r   h   m   p
4   5   d   5.0 NaN e   d   b   u   e   i   z
5   6   e   5.0 d   h   r   b   c   z   i   3
...

Как вы видите, датафреймы разделяют Вопросы b, поэтому я добавил следующие строки, которые включают _ в новый датафрейм.

Это буквально означает, что первая таблица данных и вторая таблица данных разделяют один и тот же текст t1 и t2 в ячейках столбца Answers. Но для заданной комбинации (t1,t2) где t1 == t2, когда под ней также есть строки таким образом, что QID имеет _, я хочу добавить эти строки после строки, в которую они были введены.

Я начал это:

rows_to_add = pd.DataFrame()
for i, row1 in df.iterrows():
  for j, row2 in df2.iterrows():
    if row1['Questions'] == row2['Questions']:
      # here I want to test if the next row has _ in his QID
      # if so I add all the lines with the same QID before _ but with row1 QID
      k = 0
      for _, next_row_df2 in df2[j+1:].iterrows():
        if "_" in str(next_row_df2['QID']):
          next_row_df2['QID'] = str(row1['QID']) + '_' + str(k) # but I need to change the QID to get it right when inserting rows in df2
          rows_to_add += next_row_df2 
        else:
          break # exit this loop and add the lines to the dataframe
        k += 1
      df = pd.concat([df.iloc[:i], rows_to_add, df.iloc[i:]]).reset_index(drop=True)
      rows_to_add = pd.DataFrame()

Но строки не добавляются и это не эффективно (некоторые говорят это даже ужасно). Может быть, я мог бы сделать это более эффективным способом: выполнять итерации только на df2 строках, где есть _? Или с map-reduce?

Теперь я пытаюсь:

for i, row1 in df.iterrows():
  for j, row2 in df2.iterrows():
    if row1['Questions'] == row2['Questions']:
      # here I want to test if the next row has _ in his QID
      # if so I add all the lines with the same QID before _ but with row1 QID
      k = 0
      L = []
      for _, next_row_df2 in df2[j+1:].iterrows():
        if "_" in str(next_row_df2['QID']):
          next_row_df2['QID'] = str(row1['QID']) + '_' + str(k) # but I need to change the QID to get it right when inserting rows in df2
          L.append(next_row_df2)
        else:
          break # exit this loop and add the lines to the dataframe
        k += 1
      if L:
        rows_to_add = pd.concat(L, ignore_index=True)
      df = pd.concat([df.iloc[:i], rows_to_add, df.iloc[i:]]).reset_index(drop=True)
      rows_to_add = pd.DataFrame()

Но пока нет результатов.


Ответы (0 шт):