Python: получить значения из одного кадра данных и добавить в другой (условия строки и столбца) - PullRequest
0 голосов
/ 23 ноября 2018

Предположим, у нас есть следующие два кадра данных: df1 и df2

x1 = [{'partner': "Afghanistan", 'trade_value':100, 'commodity': 1, 'year': 2013}, 
      {'partner': "Zambia",'trade_value':110, 'commodity': 2, 'year': 2016}, 
      {'partner': "Germany",'trade_value':120, 'commodity': 2, 'year': 2014},
      {'partner': "Afghanistan",'trade_value':150, 'commodity': 2, 'year': 2014},
      {'partner': "USA",'trade_value':1120, 'commodity': 5, 'year': 2013}];

df1 = pd.DataFrame(x1)

#Add GDP column
df1['GDP'] = 0;

x2 = [{'country': "Afghanistan", 'commodity': 5, 'GDP-2013': 5000, 'GDP-2014': 5500},
      {'country': "USA", 'commodity': 5, 'GDP-2013': 15012, 'GDP-2014': 16500},
      {'country': "Germany", 'commodity': 7, 'GDP-2013': 7500, 'GDP-2014': 8300}];

df2 = pd.DataFrame(x2)

Что я хочу сделать, это добавить ВВП для стран в df1 из df2 на основегод, указанный в df1.

Например: для первой строки в df1 я хочу получить ВВП для Afghanistan для года 2013.Я должен был бы пройти через df2 и найти строку с соответствующими country и GDP-year, а затем получить значение в GDP-year

Окончательный вывод df1 должен выглядеть примерно так:

|  partner   | trade_value | commodity |  year  |  GDP  | 
|------------|-------------|-----------|--------|-------|
| Afghanistan|     100     |     1     |  2013  |  5000 |
| Zambia     |     110     |     2     |  2016  |  NaN  |
| Germany    |     120     |     2     |  2014  |  8300 |
| Afghanistan|     150     |     2     |  2014  |  5500 |
| USA        |     1120    |     5     |  2013  |  16500|

Я часами пробовал методы map и loc, но ничего не получалось.Я сейчас работаю над этим:

for index, row in df2.iterrows():
    for column in df2:
         df1.loc[df1['partner'] == row['country'] and 'GDP-'+str(df1['year']) == column, ['GDP']] = row[column];

Я получаю следующую ошибку:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

С одним выстрелом:

In [24]: df1['GDP'] = df1.apply(lambda s: np.where(df2.country.str.contains(s.partner).any(), \
    ...: df2.loc[df2.country == s.partner].get('GDP-' + str(s.year), pd.Series([np.NaN])).values[0], np.NaN), axis=1)

In [25]: df1
Out[25]: 
   commodity      partner  trade_value  year      GDP
0          1  Afghanistan          100  2013   5000.0
1          2       Zambia          110  2016      nan
2          2      Germany          120  2014   8300.0
3          2  Afghanistan          150  2014   5500.0
4          5          USA         1120  2013  15012.0
0 голосов
/ 23 ноября 2018

Использование IIUC:

x1 = [{'partner': "Afghanistan", 'trade_value':100, 'commodity': 1, 'year': 2013}, 
      {'partner': "Zambia",'trade_value':110, 'commodity': 2, 'year': 2016}, 
      {'partner': "Germany",'trade_value':120, 'commodity': 2, 'year': 2014},
      {'partner': "Afghanistan",'trade_value':150, 'commodity': 2, 'year': 2014},
      {'partner': "USA",'trade_value':1120, 'commodity': 5, 'year': 2013}];  
df1 = pd.DataFrame(x1)    

x2 = [{'country': "Afghanistan", 'commodity': 5, 'GDP-2013': 5000, 'GDP-2014': 5500},
      {'country': "USA", 'commodity': 5, 'GDP-2013': 15012, 'GDP-2014': 16500},
      {'country': "Germany", 'commodity': 7, 'GDP-2013': 7500, 'GDP-2014': 8300}];    
df2 = pd.DataFrame(x2)

# Melt the dataframe.
temp = df2.melt(id_vars=['commodity','country']).drop('commodity',1)
# Extract year and convert to int.
temp.variable = temp.variable.str.slice(4).astype(int)

# Then merge it with df1.
df3 = df1.merge(temp,left_on=['partner','year'],right_on=['country','variable'],how='left')
# Drop columns which are not required.
df3 = df3.drop(['country','variable'], axis=1).rename(columns={'value':'GDP'})

print (df3)

   commodity      partner  trade_value  year      GDP
0          1  Afghanistan          100  2013   5000.0
1          2       Zambia          110  2016      NaN
2          2      Germany          120  2014   8300.0
3          2  Afghanistan          150  2014   5500.0
4          5          USA         1120  2013  15012.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...