Попытка сравнить 2 файла Excel через Python и панд - PullRequest
0 голосов
/ 20 сентября 2019

Справочная информация: у меня есть 2 файла с несколькими совпадающими столбцами, и между ними есть общий столбец для сравнения.

Пример:

Table 1 , about 10K rows
| col1 | col2 | col3 |
|------|------|------|
| adam | key1 | def  |
| mike | key2 | efg  |
Table 2 , about 5k rows
| col1 | col2 | col3 | col4 |
|------|------|------|------|
| adam | key1 | def  | abc  |
| mike | key2 |      | cdf  |

Теперь я пытаюсьполучить данные из первого файла, сравнить их со вторым и, если они отличаются, создать новый файл, чтобы получить полную строку из первого файла.Таким образом, в приведенном выше примере, принимая первый столбец в качестве столбца сравнения, для adam col1, 2, 3 одинаковы, поэтому запись обновления не требуется.для mike значение col2 будет таким же, но значение col3 будет другим, поэтому оно будет частью файла обновления.

Я использую python, и в настоящее время он слишком прост, и я не могу найти более эффективныйспособ для этого


df_1 = pd.read_excel("file1.xlsx")
df_2 = pd.read_excel("file2.xlsx")

df_1 = df_1.fillna('')
df_2 = df_2.fillna('')

df_3 = pd.DataFrame()

for i in range(0, len(df_1.index)):
    for j in range(0,len(df_2.index)):
        if(df_1[col1].iloc[i] == df_2[col1].iloc[j]):
            flag = 0
            if(df_1[col2].iloc[i] != df_2[col2].iloc[j]): flag = 1
            if(df_1[col3].iloc[i] != df_2[col3].iloc[j]): flag = 1
            if(flag): df_3 = df_3.append(df_1.iloc[[i]])
            break;

writer = ExcelWriter("update.xlsx")
df_3.to_excel(writer,index=False,header=True)

Я пробовал несколько вариантов, как показано ниже, пытался использовать что-то вдоль строк совпадения в общей строке, используя значение col1, а затем проверял, являются ли другие два значения столбца одинаковыми, и возвращал это, но не возвращает все необходимые данные

df_3 = df_1[(
            df_1['col1'].isin(df_2['col1']) & 
                (~df_1['col2'].isin(df_2['col2']) 
                | ~df_1['col3'].isin(df_2['col3']) 
                ) 
            )]

Вывод:

   col1  col2 col3
0  mike  key2  efg   

1 Ответ

0 голосов
/ 20 сентября 2019

IIUC, используйте pandas.DataFrame.update:

Дано:

# df1
   col1  col2 col3
0  adam  key1  def
1  mike  key2  efg
# df2
   col1  col2 col3 col4
0  adam  key1  def  abc
1  mike  key2       cdf


new_df = df1.set_index('col1')
new_df.update(df2.set_index('col1'))
new_df.reset_index(inplace=True)
print(new_df)

Вывод:

   col1  col2 col3
0  adam  key1  def
1  mike  key2     

Чтобы получить обновленные строки (в оригинале)состояние):

df1[(new_df != df1).any(1)]

Вывод:

   col1  col2 col3
1  mike  key2  efg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...