Сравнение двух кадров данных различной длины строка за строкой и добавление столбцов для каждой строки с одинаковым значением
У меня есть два кадра данных различной длины в пандах Python, как это:
df1: df2:
Column1 Column2 Column3 ColumnA ColumnB
0 1 a r 0 1 a
1 2 b u 1 1 d
2 3 c k 2 1 e
3 4 d j 3 2 r
4 5 e f 4 2 w
5 3 y
6 3 h
То, что я пытаюсь сделать сейчас, это сравнение Column1 из df1 и ColumnA из df2. Для каждого "попадания", где строка в ColumnA в df2 имеет то же значение, что и строка в Column1 в df1, я хочу добавить столбец к df1 с помощью столбца ColumnB of df2 для строки, в которой был найден "hit", так что мой результат выглядит так:
df1:
Column1 Column2 Column3 Column4 Column5 Column6
0 1 a r a d e
1 2 b u r w
2 3 c k y h
3 4 d j
4 5 e f
То, что я пробовал до сих пор, было:
for row in df1, df2:
if df1[Column1] == df2[ColumnA]:
print 'yey!'
который дал мне ошибку, сказав, что я не могу сравнить два кадра данных различной длины. Итак, я попробовал:
for row in df1, df2:
if def2[def2['ColumnA'].isin(def1['column1'])]:
print 'lalala'
else:
print 'Nope'
Что "работает" с точки зрения того, что я получаю вывод, но я не думаю, что он перебирает строки и сравнивает их, поскольку он печатает "lalala" только два раза. Поэтому я исследовал еще немного и нашел способ перебирать каждую строку кадра данных, а именно:
for index, row in df1.iterrows():
print row['Column1]
Но я не знаю, как использовать это для сравнения столбцов двух фреймов данных и получения желаемого результата.
Любая помощь о том, как это сделать, будет очень признательна.
1 ответ
Я рекомендую вам использовать API DataFrame, который позволяет работать с DF с точки зрения объединения, слияния, группирования и т. Д. Мое решение вы можете найти ниже:
import pandas as pd
df1 = pd.DataFrame({'Column1': [1,2,3,4,5],
'Column2': ['a','b','c','d','e'],
'Column3': ['r','u','k','j','f']})
df2 = pd.DataFrame({'Column1': [1,1,1,2,2,3,3], 'ColumnB': ['a','d','e','r','w','y','h']})
dfs = pd.DataFrame({})
for name, group in df2.groupby('Column1'):
buffer_df = pd.DataFrame({'Column1': group['Column1'][:1]})
i = 0
for index, value in group['ColumnB'].iteritems():
i += 1
string = 'Column_' + str(i)
buffer_df[string] = value
dfs = dfs.append(buffer_df)
result = pd.merge(df1, dfs, how='left', on='Column1')
print(result)
Результат:
Column1 Column2 Column3 Column_0 Column_1 Column_2
0 1 a r a d e
1 2 b u r w NaN
2 3 c k y h NaN
3 4 d j NaN NaN NaN
4 5 e f NaN NaN NaN
Ps подробнее:
1) для df2 я создаю группы по 'Column1'. Единственная группа - это фрейм данных. Пример ниже:
Column1 ColumnB
0 1 a
1 1 d
2 1 e
2) для каждой группы я создаю фрейм данных buffer_df:
Column1 Column_0 Column_1 Column_2
0 1 a d e
3) после этого я создаю DF DFS:
Column1 Column_0 Column_1 Column_2
0 1 a d e
3 2 r w NaN
5 3 y h NaN
4) в конце я выполняю левое соединение для df1 и dfs, получая нужный результат.
2) * buffer_df создается итеративно:
step0 (buffer_df = pd.DataFrame({'Column1': group['Column1'][:1]})):
Column1
5 3
step1 (buffer_df['Column_0'] = group['ColumnB'][5]):
Column1 Column_0
5 3 y
step2 (buffer_df['Column_1'] = group['ColumnB'][5]):
Column1 Column_0 Column_1
5 3 y h