python - 查找两个 pandas Dataframe 之间的差异并将所有内容添加到新的 DF

标签 python pandas concatenation

我在 DataFrames 中有两个 Guest-List,我想知道哪些名字被删除,哪些名字被添加,然后获取一个新的 DF,我该怎么办?

这两个 DF 是:

list1 = {'First Name': ['Adi', 'Beni', 'Dimi', 'Sergei'], 'Last Name': ['Beer', 'Wine', 'Liquor', 'Vodka'], 'Job': ['Brewer', 'Farmer', 'Shopowner', 'Guest']}

list2 = {'First Name': ['Adi', 'Beni', 'Sergei', 'Don'], 'Last Name': ['Beer', 'Wine', 'Vodka', 'Brown']}

如果“NameX 在 list1list2 中,则使用两者中的名称创建一个新的 DataFrame。

如果 NameX 位于 list1 中,但在 list2 中退出,请在新的 df 中显示。

如果 NameX 仅在 list2 中,请向我显示在另一个 df 中。

我该怎么做?

顺便说一下,“Job”条目只存在于一个 df 中是有意为之的。将其保留在新的dfs中是我们的目标。

最佳答案

最简单的方法是将名字和姓氏放在一起,进行比较,然后再次分开。

下面是相应的代码:

FIRST_NAME = 'First Name'
LAST_NAME = 'Last Name'
JOB = 'Job'
KEYS = [FIRST_NAME, LAST_NAME, JOB]


def intersection(lst1, lst2):
    return [value for value in lst1 if value in lst2]


def unzip(lst):
    a = []
    b = []
    for x, y in lst:
        a.append(x)
        b.append(y)
    return a, b


def get_jobs(dct, lst):
    return [dct.get(x) for x in lst]


def get_dict(lst, dict0, keys=KEYS):
    a, b = unzip(lst)
    values = [a, b, get_jobs(dict0, lst)]
    return dict(zip(keys, values))


list1 = {FIRST_NAME: ['Adi', 'Beni', 'Dimi', 'Sergei'], LAST_NAME: ['Beer', 'Wine', 'Liquor', 'Vodka'],
         JOB: ['Brewer', 'Farmer', 'Shopowner', 'Guest']}
list2 = {FIRST_NAME: ['Adi', 'Beni', 'Sergei', 'Don'], LAST_NAME: ['Beer', 'Wine', 'Vodka', 'Brown']}

mapped1 = list(zip(list1.get(FIRST_NAME), list1.get(LAST_NAME)))
mapped2 = list(zip(list2.get(FIRST_NAME), list2.get(LAST_NAME)))
dict_jobs = dict(zip(mapped1, list1.get(JOB)))

intersec = intersection(mapped1, mapped2)
left = []
right = []

for element in set(mapped1) ^ set(mapped2):
    left.append(element) if element in mapped1 else right.append(element)

dict_intersec = get_dict(intersec, dict_jobs)
dict_left = get_dict(left, dict_jobs)
dict_rigth = get_dict(right, dict_jobs)

输出:

{'First Name': ['Adi', 'Beni', 'Sergei'], 'Last Name': ['Beer', 'Wine', 'Vodka'], 'Job': ['Brewer', 'Farmer', 'Guest']}
{'First Name': ['Dimi'], 'Last Name': ['Liquor'], 'Job': ['Shopowner']}
{'First Name': ['Don'], 'Last Name': ['Brown'], 'Job': [None]}

dict_jobs中,合并的名称被映射到他们的工作。 intersec 是包含两个原始列表中包含的名称的列表。 left 包含仅出现在第一个列表中的名称,right 仅包含出现在第二个列表中的名称。

关于python - 查找两个 pandas Dataframe 之间的差异并将所有内容添加到新的 DF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59828981/

相关文章:

Python 使用 re.sub 删除后字符串。

python - 什么是最好的 Google App Engine blobstore 工作流程?

python - datetime 如何理解第 53 周?

python - Pandas - 在数据框中的列中展开嵌套的 json 数组

python - 读取大 CSV 后跟 `.iloc` 切片列时出现 Pandas MemoryError

连接两个 *chars 没有字符串函数?

python - 列表 += 元组与列表 = 列表 + 元组

python - PIL.Image.fromarray 的空信息

python - 将大量输出转储到变量

reporting-services - ssrs rdl 文本框表达式串联字符串和字段