python Сравните два значения фрейма данных и получите различные значения из первого фрейма данных - PullRequest
0 голосов
/ 06 мая 2020

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

import pandas as pd
df1 = pd.DataFrame(
    {
        "Server": ["Server1", "Server1","Server1","Server1","Server1"],
        "FileName": [
            "2020-05-01T18:18:00Z/Server1/file1",
            "2020-05-01T18:18:13Z/Server1/file2",
            "2020-05-01T18:20:47Z/Server1/file3",
            "2020-05-01T18:21:46Z/Server1/file4",
            "2020-05-01T18:24:43Z/Server1/file5",
        ],
    }
)


df2 = pd.DataFrame(
    {
        "Server": ["Server1", "Server1","Server1","Server1","Server1"],
        "FileName": [
            "2020-05-01T18:18:00Z/Server1/file1",
            "2020-05-01T18:18:13Z/Server1/file2",
            "2020-05-01T18:20:47Z/Server1/file3",
            "2020-05-01T18:33:08Z/Server1/file6",
            "2020-05-01T18:33:11Z/Server1/file7",
        ],
    }
)

df1:

                             FileName   Server
0  2020-05-01T18:18:00Z/Server1/file1  Server1
1  2020-05-01T18:18:13Z/Server1/file2  Server1
2  2020-05-01T18:20:47Z/Server1/file3  Server1
3  2020-05-01T18:21:46Z/Server1/file4  Server1
4  2020-05-01T18:24:43Z/Server1/file5  Server1

df2:

                             FileName   Server
0  2020-05-01T18:18:00Z/Server1/file1  Server1
1  2020-05-01T18:18:13Z/Server1/file2  Server1
2  2020-05-01T18:20:47Z/Server1/file3  Server1
3  2020-05-01T18:33:08Z/Server1/file6  Server1
4  2020-05-01T18:33:11Z/Server1/file7  Server1

Мне нужны файлы из df1, которых нет в df2 . Столбец Server здесь не имеет значения. Я хочу ниже фрейм данных

                             FileName   Server
0  2020-05-01T18:21:46Z/Server1/file4  Server1
1  2020-05-01T18:24:43Z/Server1/file5  Server1

Я добился этого, перебирая каждое значение. Есть ли какой-нибудь небольшой и быстрый способ сделать это.

df = pd.DataFrame()
for index1, row1 in df1.iterrows():
    flag = 0
    for index2, row2 in df2.iterrows():
        if row1['FileName'] == row2['FileName']:
            flag = 1
    if flag == 0:
        df = df.append({'Server': row1['Server'], 'FileName': row1['FileName']}, ignore_index=True)
print df

Ответы [ 3 ]

1 голос
/ 06 мая 2020

Это будет работать:

df1[df1['FileName'] != df2['FileName']].reset_index(drop=True)
1 голос
/ 06 мая 2020

вы можете использовать метод isin

df1[~df1['FileName'].isin(df2['FileName'])]
1 голос
/ 06 мая 2020

Я не уверен, насколько это будет эффективно, но вы можете использовать этот 1 лайнер-код вместо l oop для итерации ваших фреймов данных.

result = pd.DataFrame(df1.merge(df2, how = 'outer' ,indicator=True).loc[lambda x : x['_merge']=='left_only'])
del result["_merge"] #You can keep this _merge column

print(result)

output

    Server                            FileName
3  Server1  2020-05-01T18:21:46Z/Server1/file4
4  Server1  2020-05-01T18:24:43Z/Server1/file5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...