簡體   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