繁体   English   中英

如何使用pandas PYTHON按列中的值合并两个CSV文件

[英]How to merge two CSV files by value in column using pandas PYTHON

我有 2 个 csv 文件的价格和性能。

这是每个的数据布局

价钱:

表现

表现:

表现

我使用以下命令将它们导入 python:

import pandas as pd

price = pd.read_csv("cpu.csv")
performance = pd.read_csv("geekbench.csv")

这按预期工作,但是我不确定如何创建一个新的 csv 文件,在 Price[brand + model] 和 Performance[name] 之间匹配

我要拿:

  • 核心、tdp 和价格来自价格
  • 性能得分、multicore_score 和名称

使用上面的这些参数创建一个新的 csv 文件。 问题 我一直在寻找一种很好的匹配方法,该方法忽略了大小写等细微差异,我正在研究模糊字符串匹配等算法,但不确定最佳选择是什么。

这是我当前的尝试,但会引发错误;

for i in range(len(price.index)):
    brand = (price.iloc[i, 0])
    model = (price.iloc[i, 1])
    print(model)
    print(performance)
    print(performance.query('name == brand+model'))

谢谢

我建议如下:

import nltk
import pandas as pd
tokenizer = nltk.RegexpTokenizer(r'\w+')
price = pd.DataFrame({"brand": ["AMD", "AMD", "AMD", "AMD"],
                      "model" : ["2650", "3800", "5150", "4200"],
                      "cores" : [2,4,4,4],
                      "tdp" : [25,25,25,25]})
performance = pd.DataFrame({"name": ["AMD Athlon 64 3200+",
                                     "AMD Athlon 64 X2 3800+",
                                     "AMD Athlon 64 X2 4000+",
                                     "AMD Athlon 64 X2 4200+"],
                            "score" : [6,5,6,18]})
# I break down the name in performance and suppress capital letters
performance["tokens"] = (performance["name"].str.lower()
                         .apply(tokenizer.tokenize))
# And the same for price
price["tokens"] = price.loc[:,"brand"].values + " " + \
                   price.loc[:,"model"].values
price["tokens"] = (price["tokens"].str.lower()
                         .apply(tokenizer.tokenize))
# cartesian product

price["key"] = 1
performance["key"] = 1
df = pd.merge(price,performance, on = "key")
# define my criteria for match
n_match = 2

df['intersection'] =\
    [len(list(set(a).intersection(set(b))))
     for a, b in zip(df.tokens_x,
                     df.tokens_y)]
df = df.loc[df["intersection"]>=n_match,:]

我重新定义了你的数据集,以便在这个例子中我们会有一些匹配。 这是我的结果:

   brand model  cores  ...  score                     tokens_y  intersection
5    AMD  3800      4  ...      5  [amd, athlon, 64, x2, 3800]             2
15   AMD  4200      4  ...     18  [amd, athlon, 64, x2, 4200]             2
[2 rows x 10 columns]

您可以重新定义n_match的标准我放了两个,因为它似乎是数据集所需要的。 希望能帮助到你

您可以在价格中创建“名称”列后合并 2 个帧,然后将其与该“名称”上的 Performane 合并。

Price['name'] = Price.brand + ' ' + Price.model.astype(str)
Price.merge(Performance, on='name')

但是,结果框架可能是空的,因为至少您在问题中显示的示例数据行不匹配。 这不是例如大写的语言问题,而只是缺少信息。 只有在用“真实语言”定义关系规则后,您才能用 Python 对其进行编码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM