Сравните два списка в python и сохраните результаты в отдельном списке - PullRequest
1 голос
/ 22 апреля 2020

мой код на данный момент:

import csv

myIds = ['1234','3456','76']
countries = []

# open the file
with open('my.csv', 'r') as infile:
  # read the file as a dictionary for each row ({header : value})
  reader = csv.DictReader(infile)
  data = {}
  for row in reader:
    for header, value in row.items():
      try:
        data[header].append(value)
      except KeyError:
        data[header] = [value]

# extract the variables and assign to lists
myFileIds = data['id']
myFileCountry = data['country']
listfromfile = [a + " " + b for a, b in zip(myFileIds, myFileCountry)]

, приведенный выше дает эти результаты в listfromfile следующим образом:

listfromfile = ['1 Uruguay', '2 Vatican', '1234 US', '3456 UK', '5678 Brazil','10111 Argentina','234567 Spain']

Я стремлюсь к списку со странами, для которых идентификаторы встречаются в Файл my.csv, но также возможно, что идентификатор из списка myIds не будет присутствовать в файле my.csv. Затем мне нужно, чтобы это место в списке показывалось как «Неподдерживаемая страна». Оба списка должны иметь одинаковую длину myIds и страны, поэтому я буду знать, что первый идентификатор в моем списке соответствует первой стране в другом списке и т. Д. c. Желаемый результат:

myIds = ['1234','3456','76']
countries = ['US', 'UK', 'Unsupported Country']

В качестве альтернативы я пытаюсь с pandas, но тоже не повезло :(

import pandas as pd

df=pd.read_csv('my.csv')
myIds = ['1234','3456','76']

countries = df.loc[df["id"].isin(myIds),"country"].tolist()

my.csv:

id     country
1      Uruguay
2      Vatican
1234   US
3456   UK
5678   Brazil
10111  Argentina
234567 Spain

Может кто-нибудь, помогите мне с этим, пожалуйста? заранее спасибо!

Ответы [ 3 ]

1 голос
/ 23 апреля 2020

Этого можно добиться, используя кадры данных.

import pandas as pd
input_df = pd.read_csv("test.csv")
myIds = ['1234','3456','76']
my_ids_df = pd.DataFrame(myIds,columns=['id']).astype(int)
output_df = pd.merge(input_df, my_ids_df, on=['id'], how='right')
output_df['country'] = output_df['country'].fillna('Unsupported Country')
print(list(zip(output_df['id'].values.tolist(),output_df['country'].values.tolist())))
1 голос
/ 22 апреля 2020

Может быть, это будет полезно для ваших целей:

Предполагается, что данные вашего файла такие же, как в вашем примере. В противном случае, вы можете разделить на другого персонажа.

>>> from collections import defaultdict
>>> country_data = defaultdict(lambda: 'Unsupported Country')
>>> 
>>> for line in open("my.csv", 'r'):
...     try:
...         id, country = line.split()
...         country_data[int(id)] = country
...         country_data[country] = int(id)
...     except ValueError:
...         pass # Row isn't in the right format. Skip it.
...         
>>> country_data['Vatican']
2
>>> country_data[2]
'Vatican'
>>> country_data['Moojoophorbovia']
'Unsupported Country'
>>> 

Если вы не пытаетесь вписать квадратный колышек в круглое отверстие, предполагая, что вам нужно два списка, которые вы должны держать в синхронизации c - и затем попытка вписать в них данные вашего файла, приведенное выше может решить проблему чтения данных страны и получения доступа к ним по индексу идентификатора или получения идентификатора из названия страны.

0 голосов
/ 23 апреля 2020
 import pandas as pd

 myIds = ['1234','3456','76']

 df = pd.DataFrame(myIds, columns=['id'])

 fields=['id', 'country']

 df = df1
 df2 = pd.read_csv('my.csv', sep = ',', usecols=fields)
 df3 = df1.merge(df2, on="id", how='left')
 df3['country'].fillna('Unsupported Country', inplace=True)
 del df3['id']
 countries = df3['country'].tolist()

выше у меня работает. Тем не менее, все еще пытаюсь найти более простое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...