У меня есть CSV и я хочу обновить его значениями из другого CSV.Какой самый эффективный способ сделать это? - PullRequest
0 голосов
/ 11 мая 2018

У меня есть этот CSV:

      Name  Species    Country
0    Hobbes   Tiger       U.S.
1  SherKhan   Tiger      India
2   Rescuer   Mouse  Australia
3    Mickey   Mouse       U.S.

And I have a second CSV: 
   Continent     Countries Unnamed: 2 Unnamed: 3 Unnamed: 4
0  North America          U.S.     Mexico  Guatemala   Honduras
1           Asia         India      China      Nepal        NaN
2      Australia     Australia        NaN        NaN        NaN
3         Africa  South Africa   Botswana   Zimbabwe        NaN

I want to use the second CSV to update the first file so that the output is:
      Name  Species        Country
0    Hobbes   Tiger  North America
1  SherKhan   Tiger           Asia 
2   Rescuer   Mouse      Australia
3    Mickey   Mouse  North America

Пока это самое близкое, что я получил:

import pandas as pd

# Import my data. 
data = pd.read_csv('Continents.csv')
Animals = pd.read_csv('Animals.csv')
Animalsdf = pd.DataFrame(Animals)

# Transpose my data from horizontal to vertical. 
data1 = data.T

# Clean my data and update my header with the first column. 
data1.columns = data1.iloc[0]

# Drop now duplicated data. 
data1.drop(data1.index[[0]], inplace = True)
# Build the dictionary. 
data_dict = {col: list(data1[col]) for col in data1.columns}

# Update my csv. 
Animals['Country'] = Animals['Country'].map(data_dict)

print ('Animals')

В результате получается словарь со списками в качестве значений, и поэтому я просто получаю NaN:

      Name  Species                     Country
0    Hobbes   Tiger                         NaN
1  SherKhan   Tiger                         NaN
2   Rescuer    Mole  [Australia, nan, nan, nan]
3    Mickey    Mole                         NaN

Я пробовал переключаться между списками и кортежами, но это не работает. Перепробовал несколько способов вытащить словарь и т. Д. У меня просто нет идей.

Извините, если код супер джанки. Я учусь этому на ходу. Придуманный проект был лучшим способом выучить новый язык. Не думал, что это будет так сложно.

Любые предложения будут оценены. Мне нужно иметь возможность использовать код, чтобы при получении нескольких эталонных CSV я мог обновлять свои данные новыми ключами. Надеюсь, это понятно.

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 12 мая 2018

Одним из интуитивно понятных решений является использование словарного отображения.Данные из @ WillMonge.

pd.DataFrame.itertuples работают путем создания именованных кортежей, но на них также можно ссылаться с помощью числовых индексаторов.

# create mapping dictionary
d = {}
for row in df.itertuples():
    d.update(dict.fromkeys(filter(None, row[2:]), row[1]))

# apply mapping dictionary
data['Continent'] = data['Country'].map(d)

print(data)

  Country  name Continent
0   China     2      Asia
1   China     5      Asia
2  Canada     9   America
3   Egypt     0    Africa
4  Mexico     3   America
0 голосов
/ 11 мая 2018

Вот обновление вашего кода, я попытался добавить комментарии, чтобы объяснить

import pandas as pd

# Read data in (read_csv also returns a DataFrame directly)
data = pd.DataFrame({'name': [2, 5, 9, 0, 3], 'Country': ['China', 'China', 'Canada', 'Egypt', 'Mexico']})
df = pd.DataFrame({'Continent': ['Asia', 'America', 'Africa'],
                   'Country1': ['China', 'Mexico', 'Egypt'],
                   'Country2': ['Japan', 'Canada', None],
                   'Country3': ['Thailand', None, None ]})

# Unstack to get a row for each country (remove the continent rows)
premap_df = pd.DataFrame(df.unstack('Continent').drop('Continent')).dropna().reset_index()
premap_df.columns = ['_', 'continent_key', 'Country']

# Merge the continent back based on the continent_key (old row number)
map_df = pd.merge(premap_df, df[['Continent']], left_on='continent_key', right_index=True)[['Continent', 'Country']]

# Merge with the data now 
pd.merge(data, map_df, on='Country')

Для дальнейшего ознакомления, Python для анализа данных Уэса МакКинни ( здесь - это PDF-версия, которую я нашел в Интернете) - одна из лучших книг для изучения pandas

0 голосов
/ 11 мая 2018

Вы всегда можете создать сегменты и условия выполнения:

import pandas as pd
import numpy as np
df = pd.DataFrame({'Name':['Hobbes','SherKhan','Rescuer','Mickey'], 'Species':['Tiger','Tiger','Mouse','Mouse'],'Country':['U.S.','India','Australia','U.S.']})

North_America = ['U.S.', 'Mexico', 'Guatemala', 'Honduras'] 
Asia = ['India', 'China', 'Nepal']
Australia = ['Australia']
Africa = ['South Africa', 'Botswana', 'Zimbabwe']

conditions = [
(df['Country'].isin(North_America)),
(df['Country'].isin(Asia)),
(df['Country'].isin(Australia)),
(df['Country'].isin(Africa))
]
choices = [
'North America',
'Asia',
'Australia',
'Africa'
]
df['Continent'] = np.select(conditions, choices, default = np.nan)
df
0 голосов
/ 11 мая 2018

Вы должны использовать DictReader и DictWriter. Вы можете узнать, как их использовать, по ссылке ниже.

https://docs.python.org/2/library/csv.html

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