Как посчитать перекрывающиеся строки между несколькими фреймами данных? - PullRequest
4 голосов
/ 22 января 2020

У меня несколько фреймов данных, как показано ниже.

df1 = pd.DataFrame({'Col1':["aaa","ddd","ggg"],'Col2':["bbb","eee","hhh"],'Col3':"ccc","fff","iii"]})
df2= pd.DataFrame({'Col1':["aaa","zzz","qqq"],'Col2':["bbb","xxx","eee"],'Col3':["ccc", yyy","www"]})
df3= pd.DataFrame({'Col1':"rrr","zzz","qqq","ppp"],'Col2':"ttt","xxx","eee","ttt"],'Col3':"yyy","yyy","www","qqq"]})

enter image description here

Фрейм данных имеет 3 столбца, и иногда их строки перекрываются между фреймами данных. (например, df1 и df2 имеют строку, идентичную «aaa, bbb, ccc»).

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

enter image description here

В этих выходных данных, если в кадре данных обнаружена идентичная строка, выходной будет 1, в противном случае 0. Кто-нибудь знает, как сделать этот выходной сигнал?

В реальных данных у меня ~ 100 фреймов данных. Сначала я попытался использовать pd.merge, но не смог применить это к 100 кадрам данных ...

Большое спасибо за вашу помощь.

Ответы [ 3 ]

3 голосов
/ 22 января 2020

Вот один из способов использования concat и get_dummies:

l = [df1,df2,df3] #create a list of dataframes
final = pd.concat([i.assign(key=f"df{e+1}") for e,i in enumerate(l)],sort=False)

final = (final.assign(**pd.get_dummies(final.pop('key')))
        .groupby(['Col1','Col2','Col3']).max().reset_index())

  Col1 Col2 Col3  df1  df2  df3
0  aaa  bbb  ccc    1    1    0
1  ddd  eee  fff    1    0    0
2  ggg  hhh  iii    1    0    0
3  ppp  ttt  qqq    0    0    1
4  qqq  eee  www    0    1    1
5  rrr  ttt  yyy    0    0    1
6  zzz  xxx  yyy    0    1    1
2 голосов
/ 22 января 2020

Использование pandas.concat и groupby:

dfs = [df1,df2,df3]
dfs = [d.assign(df='df%s' % n) for n, d in enumerate(dfs, start=1)]
new_df = pd.concat(dfs).groupby(['Col1', 'Col2', 'Col3','df']).size().unstack(fill_value=0)
print(new_df)

Вывод:

df              df1  df2  df3
Col1 Col2 Col3               
aaa  bbb  ccc     1    1    0
ddd  eee  fff     1    0    0
ggg  hhh  iii     1    0    0
ppp  ttt  qqq     0    0    1
qqq  eee  www     0    1    1
rrr  ttt  yyy     0    0    1
zzz  xxx  yyy     0    1    1
1 голос
/ 22 января 2020

Настройка:

df1 = pd.DataFrame({'Col1':["aaa","ddd","ggg"],'Col2':["bbb","eee","hhh"],'Col3':["ccc","fff","iii"]})
df2= pd.DataFrame({'Col1':["aaa","zzz","qqq"],'Col2':["bbb","xxx","eee"],'Col3':["ccc", "yyy","www"]})
df3= pd.DataFrame({'Col1':["rrr","zzz","qqq","ppp"],'Col2':["ttt","xxx","eee","ttt"],'Col3':["yyy","yyy","www","qqq"]})

Решение:

Сначала создайте столбец индикации для каждого кадра данных, затем concat, groupby и sum.

df1['df1'] = df2['df2'] = df3['df3'] = 1
(
    pd.concat([df1, df2, df3], sort=False)
    .groupby(by=['Col1', 'Col2', 'Col3'])
    .max().astype(int)
    .reset_index()
)

        Col1    Col2    Col3    df1 df2 df3
0       aaa     bbb     ccc     1   1   0
1       ddd     eee     fff     1   0   0
2       ggg     hhh     iii     1   0   0
3       ppp     ttt     qqq     0   0   1
4       qqq     eee     www     0   1   1
5       rrr     ttt     yyy     0   0   1
6       zzz     xxx     yyy     0   1   1
...