Python Pandas соответствует фреймам данных

У меня, например, есть 3 разных фрейма данных, каждый с разными столбцами, за исключением одного столбца с тем же заголовком, который существует во всех 3 фреймах данных. В этом столбце у меня есть, например, имена, и я хочу подсчитать, сколько раз имя повторяется в разных фреймах данных.

Так, например, это 3 фрейма данных:

df1:

col1   col2   names   col3
 a       a     bbb      a
 a       a     ccc      a
 a       a     bbb      a

df2:

col4   col5   names   col6
 a       a     bbb      a
 a       a     zzz      a
 a       a     qqq      a

df3:

col7   col8   names   col9
 a       a     zzz      a
 a       a     zzz      a
 a       a     rrr      a

поэтому выходной кадр данных будет:

names    df1    df2    df3   total
 bbb      V      V      X      2
 ccc      V      X      X      1
 zzz      X      V      V      2
 qqq      X      V      X      1
 rrr      X      X      V      1

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

Есть ли простой способ с помощью pandas выполнять этот поиск и подсчет, или мне нужно переключить его на списки и начать перебирать списки?


person TheDaJon    schedule 25.05.2017    source источник


Ответы (1)


Вы можете использовать concat + _ 2_ + _ 3_ + _ 4_ + _ 5_ + _ 6_ + _ 7_ + _ 8_:

dfs = [df1, df2, df3]
names = ['df1', 'df2', 'df3']
df = pd.concat([df['names'] for df in dfs], keys=names)
df = pd.get_dummies(df.reset_index(level=1, drop=True)).groupby(level=0).max().T
df['total'] = df.sum(axis=1)
df[names] = df[names].replace({0:'X', 1:'V'})
print (df)
    df1 df2 df3  total
bbb   V   V   X      2
ccc   V   X   X      1
qqq   X   V   X      1
rrr   X   X   V      1
zzz   X   V   V      2
person jezrael    schedule 25.05.2017
comment
отлично работает, хотя вопрос: во-первых, как я могу отфильтровать и скрыть строки, например, их «общее» меньше 2? - person TheDaJon; 25.05.2017
comment
Рад может помочь !. Что значит скрыть? удалить строки? заменить на NaN? - person jezrael; 25.05.2017
comment
удалить строки - person TheDaJon; 25.05.2017
comment
Затем используйте boolean indexing - df1 = df[df['total'] >= 2] - требуется inverse условие - ›От <2 до >=2 - person jezrael; 25.05.2017
comment
Или используйте query - df1 = df.query('total >= 2') - person jezrael; 25.05.2017