проверить два значения столбца двух CSV-файлов и, если совпадение найдено, записать в другой CSV-файл

1

У меня есть два файла csv с именем 1.csv и 2.csv с 1.csv из 50 строк и 2.csv из 75 строк. теперь я пытаюсь найти, если в обоих файлах присутствует имя пользователя и функция, а затем записывается в новый файл.

мой код до сих пор:

with open('1.csv') as a:
    c=pd.read_csv(a)
    with open('2.csv') as b:
        d=pd.read_csv(b)
        if (c['User'] == d['User'] and c['Feature'] == d['Feature'] and c['ipaddress'] == d['ipaddress']):
         c.to_csv('3.csv')

но с этим кодом я получаю следующую ошибку.

Traceback (most recent call last):
  File "path/main.py", line 181, in <module>
    if (c['User'] == d['User'] and c['Feature'] == d['Feature'] and c['ipaddress'] == d['ipaddress']):
  File "path\lib\site-packages\pandas\core\ops.py", line 1190, in wrapper
    raise ValueError("Can only compare identically-labeled "
ValueError: Can only compare identically-labeled Series objects

Любая помощь будет очень высоко ценится.

1.csv :
name feature start_date 
aaaa  apple  2018-02-10 
bbbb  mango  2018-03-11 
cccc  orange 2018-04-12 
dddd  guava  2018-05-13 

2.csv : 

name feature  end_date
aaaa  apple   2018-02-13
bbbb  mango   2018-03-16
cccc  orange  2018-04-15
dddd  guava   2018-05-18
eeee  Avocado 2018-06-14
ffff  Banana  2018-07-13
gggg  Bilberry 2018-08-09

Expected output 3.csv

name feature start_date end_date   difference
aaaa  apple  2018-02-10 2018-02-13 3days.
bbbb  mango  2018-03-11 2018-03-16 5days.
cccc  orange 2018-04-12 2018-04-15 3days.
dddd  guava  2018-05-13 2018-05-18 5days.
  • 0
    Определите, что вы подразумеваете под «соответствием» и покажите пример, пожалуйста
  • 0
    Спасибо, я отредактировал свой вопрос. пожалуйста, проверьте
Теги:
pandas
csv
match

2 ответа

1

Вы можете легко сделать это в нескольких строках кода:

import pandas as pd

# Uncomment to read from file and comment out a, b vars from pd.DataFrame
#a = pd.read_csv('1.csv')
#b = pd.read_csv('2.csv')
a = pd.DataFrame({'name': ['aaaa', 'bbbb', 'cccc', 'dddd'],
                  'feature': ['apple', 'mango', 'orange', 'guava'],
                  'start_date': ['2018-02-10','2018-03-11','2018-04-12','2018-05-13',]})

b = pd.DataFrame({'name': ['aaaa', 'bbbb', 'cccc', 'dddd', 'eeee', 'ffff', 'gggg'],
                  'feature': ['apple', 'mango', 'orange', 'guava', 'Avocado', 'Banana','Bilberry',],
                  'end_date': ['2018-02-13','2018-03-16','2018-04-15','2018-05-18','2018-06-14','2018-07-13','2018-08-09']})

# replace to on=['name', 'feature', 'ipaddress'] if needed.
# In example you don't have 'ipaddress', but in your code you have it
c = pd.merge(a, b, how='inner', on=['name', 'feature'])
c['difference'] = pd.to_datetime(c['end_date']) - pd.to_datetime(c['start_date'])
print(c)
#Uncomment to save to file
#c.to_csv('3.csv')

Проверьте переменные. Он полностью такой же, как в вашем примере.

print(a)

   name feature  start_date
0  aaaa   apple  2018-02-10
1  bbbb   mango  2018-03-11
2  cccc  orange  2018-04-12
3  dddd   guava  2018-05-13

print(b)

   name   feature    end_date
0  aaaa     apple  2018-02-13
1  bbbb     mango  2018-03-16
2  cccc    orange  2018-04-15
3  dddd     guava  2018-05-18
4  eeee   Avocado  2018-06-14
5  ffff    Banana  2018-07-13
6  gggg  Bilberry  2018-08-09

print(c)

   name feature  start_date    end_date difference
0  aaaa   apple  2018-02-10  2018-02-13     3 days
1  bbbb   mango  2018-03-11  2018-03-16     5 days
2  cccc  orange  2018-04-12  2018-04-15     3 days
3  dddd   guava  2018-05-13  2018-05-18     5 days

Надеюсь это поможет!

  • 0
    Я попробовал ваш код, но он дает 900 возможных комбинаций, то есть он соединяет 75 строк 2.csv с каждой строкой 1.csv, которая составляет 50 строк.
  • 0
    Вы добавили "on = ['name', 'feature']"? Это прекрасно работает, например, в вашем вопросе
Показать ещё 4 комментария
0

Используйте слияние.

df1 = pd.read_csv('1.csv')
df2 = pd.read_csv('2.csv')
df3 = df1.merge(df2, on = ['name','feature'],how = 'left')

Затем вы можете выполнить вычитание для дат в зависимости от типа данных столбцов метки времени.

  • 0
    Я попробовал это, но так как у меня разное количество строк в обоих файлах, я не могу его использовать. если я использую его, то для одной строки в 1.csv у меня будет 7 записей в выходном файле.
  • 0
    Вы, должно быть, упустили, how = 'left' . С этим аргументом невозможно, чтобы количество результирующих строк превысило количество строк в df1.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню