У меня есть три разных кадра панд. Порядок строк в одном кадре данных не связан с порядком в других кадрах данных. Я хочу найти фрейм данных со строками, где каждая строка будет существовать в трех исходных фреймах данных с некоторым индексом (который может различаться в разных фреймах).

Посмотрим на пример:

import pandas as pd 

# initialize list of lists 
data1 = [['tom', 10], ['mike', 15], ['lucy', 20], ['jerry', 5]] 
data2 = [['david', 5], ['bran', 6], ['tom', 10], ['mike', 15], ['jimmy', 20], ['kevin', 5], ['juli', 6]]
data3 = [['mike', 15], ['tom', 10], ['lucy', 20], ['ron', 5]]

# Create the pandas DataFrame 
df1 = pd.DataFrame(data1, columns = ['Name', 'Age']) 
df2 = pd.DataFrame(data2, columns = ['Name', 'Age']) 
df3 = pd.DataFrame(data3, columns = ['Name', 'Age'])

Если мы распечатаем эти кадры данных, мы получим

>> df1

    Name    Age
0   tom     10
1   mike    15
2   lucy    20
3   jerry   5

>> df2
    Name    Age
0   david   5
1   bran    6
2   tom     10
3   mike    15
4   jimmy   20
5   kevin   5
6   juli    6

>> df3
    Name    Age
0   mike    15
1   tom     10
2   lucy    20
3   ron     5

Обратите внимание, что строки со значениями (tom, 10) и (mike, 15) встречаются во всех 3 фреймах данных. Итак, кадр данных, который я хочу создать, будет выглядеть следующим образом (порядок строк не имеет значения):

    Name    Age
  0 mike    15
  1 tom     10

Как я могу сделать это эффективно? В моей реальной проблеме у меня есть 6 столбцов, и число строк в каждом кадре данных может быть между 30 и 200.

3
Atia Amin 21 Дек 2019 в 05:28

2 ответа

Лучший ответ

Вы можете использовать pivot, а затем использовать aggfunc = 'size', чтобы сделать это:

df = pd.concat([df1,df2,df3]) 
maxlen = df.pivot_table(index=['Name', 'Age'], aggfunc='size').max()
new_df = (df.pivot_table(index=['Name', 'Age'], aggfunc='size') == maxlen).reset_index() 
new_df[new_df[0] == True].reset_index(drop=True).drop(columns=0)


   Name  Age
0  mike   15
1   tom   10

Вы также можете использовать groupby (более простое решение):

new_df = pd.concat([df1,df2,df3]).groupby(['Name','Age']).size() 
new_df[new_df == new_df.max()] 

Name  Age
mike  15     3
tom   10     3
dtype: int64

И если вам не нужен дополнительный столбец:

new_df[new_df == new_df.max()].reset_index().drop(columns=0)

   Name  Age
0  mike   15
1   tom   10
1
oppressionslayer 21 Дек 2019 в 03:17

Я использовал слияние в пандах Dataframe.

pd.merge(pd.merge(df1, df2, how = 'inner', on='Name'), df3, how='inner', on='Name')

Эксперты, не могли бы вы прокомментировать этот подход? Я уверен, что это лучше для двух Dataframes.

1
hemanta 21 Дек 2019 в 03:09