pandas: сравнение данных по строкам - PullRequest
0 голосов
/ 29 февраля 2020

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

Например,

import pandas as pd

df1 = pd.DataFrame({'a': [1,2,3,5], 'b': [2,3,4,6], 'c':[60,20,40,30], 'd':[50,90,10,30]})
df2 = pd.DataFrame({'a': [1,2,3,5], 'b': [2,3,4,6], 'c':[60,20,40,30], 'd':[50,90,40,40]})

Я буду объединять эти два фрейма данных в столбце a и b. Есть две строки (первые две), которые имеют одинаковые значения для c и d в обоих кадрах данных.

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

df = df1.merge(df2, on=['a','b'])
cols1 = [c for c in df.columns.tolist() if c.endswith("_x")]
cols2 = [c for c in df.columns.tolist() if c.endswith("_y")] 
num_rows_equal = 0

for index, row in df.iterrows():
    not_equal = False
    for col1,col2 in zip(cols1,cols2):
        if row[col1] != row[col2]:
            not_equal = True
            break
    if not not_equal:  # row values are equal
        num_rows_equal += 1

num_rows_equal

Есть ли более эффективный (pythoni c ) способ добиться того же результата?

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Более короткий путь достижения этого:

import pandas as pd

df1 = pd.DataFrame({'a': [1,2,3,5], 'b': [2,3,4,6], 'c':[60,20,40,30], 'd':[50,90,10,30]})
df2 = pd.DataFrame({'a': [1,2,3,5], 'b': [2,3,4,6], 'c':[60,20,40,30], 'd':[50,90,40,40]})
df = df1.merge(df2, on=['a','b'])

comparison_cols = [c.strip('_x') for c in df.columns.tolist() if c.endswith("_x")]
num_rows_equal = (df1[comparison_cols][df1[comparison_cols] == df2[comparison_cols]].isna().sum(axis=1) == 0).sum()
1 голос
/ 29 февраля 2020

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

 df_r = pd.merge_ordered(df1,df2,how='inner')

    a   b   c   d
0   1   2   60  50
1   2   3   20  90

no_of_rows = df_r.shape[0]

#print(no_of_rows)
#2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...