Добавлять дополнительные строки из одного фрейма данных в другой, когда они совпадают по значениям определенного столбца
У меня есть первый дата-кадр, к которому я должен добавить строки второй дата-кадр.
Этот более или менее похож на первый:
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()
Но пока нет результатов.