Как объединить два CSV-файла по значению в столбце, используя pandas PYTHON - PullRequest
0 голосов
/ 31 марта 2020

У меня есть 2 CSV-файла цена и производительность.

Вот расположение данных каждого

Цена:

performance

Производительность:

performance

Я импортирую их в python, используя:

import pandas as pd

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

Это работает как задумано, однако я не уверен, как создать новый CSV-файл с соответствиями между Ценой [бренд + модель] и Производительностью [имя]

Я хочу взять:

  • Ядра, tdp и цена от Price
  • Score, multicore_score и name от Performance

Создайте новый 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'))

Спасибо

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Я предлагаю следующее:

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 Я поставил два, потому что казалось, что это было то, что требовалось для набора данных. Надеюсь, это поможет

0 голосов
/ 31 марта 2020

Вы можете объединить 2 кадра после создания столбца «name» в цене, а затем объединить его с Performane для этого «name».

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

Однако полученный кадр, вероятно, будет пустым, поскольку по крайней мере примерные строки данных, которые вы показываете в своем вопросе, не будут совпадать. Это не лингвистическая проблема, например, капитализация, а просто отсутствие информации. Только после определения правила отношений на «реальном языке» вы сможете закодировать его в Python.

...