Сравнение двух кадров данных различной длины строка за строкой и добавление столбцов для каждой строки с одинаковым значением

У меня есть два кадра данных различной длины в пандах 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
Другие вопросы по тегам