Python зацикливает два разных фрейма данных для создания нового столбца - PullRequest
0 голосов
/ 22 мая 2018

Я хочу добавить новый столбец в фрейм данных, ссылаясь на другой фрейм данных.

Я хочу выполнить оператор if, используя метод startwith, чтобы сопоставить столбец df1 ['BSI'] с df2 ['initial'], чтобы назначить соответствующий df2 ['marker'], и дать df1 новый столбец, которыйсостоит из маркеров, которые я буду использовать для стиля маркера cartopy.

У меня проблемы с циклом df2 внутри цикла df1.Я в принципе не могу понять, как вызвать элемент df1 в цикл df2 для сравнения с элементами df2.

df1 выглядит так:

    BSI     Shelter_Number  Location                            Latitude    Longitude
0   AA-010  1085            SUSSEX (N SIDE) & RIDEAU FALLS      45.439571   -75.695694
1   AA-030  3690            SUSSEX (E SIDE) & ALEXANDER NS      45.442795   -75.692322
2   AA-180  279             CRICHTON (E SIDE) & BEECHWOOD FS    45.439556   -75.676849
3   AA-200  2018            BEECHWOOD (S SIDE) & CHARLEVOIX NS  45.441154   -75.673622
4   AA-220  3301            BEECHWOOD (S SIDE) & MAISONNEUVE NS 45.442188   -75.671356

df2 выглядит так:

    initial marker
0   AA      bo
1   AB      bv
2   AC      b^
3   AD      b<
4   AE      b>

желаемый вывод:

BSI, Shelter_Number, Location, Latitude, Longitude, marker

0
AA-010 1085 SUSSEX (N SIDE) & RIDEAU FALLS 45.439571 -75.695694 bo

1
AA-030 3690 SUSSEX (E SIDE) & ALEXANDER NS 45.442795 -75.692322 bo

2
AA-180 279 CRICHTON (E SIDE) & BEECHWOOD FS 45.439556 -75.676849 bo

3
AA-200 2018 BEECHWOOD (S SIDE) & CHARLEVOIX NS 45.441154 -75.673622 bo

4
AA-220 3301 BEECHWOOD (S SIDE) & MAISONNEUVE NS 45.442188 -75.671356 bo

Ответы [ 2 ]

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

Используйте карту.Фактически, есть много похожих ответов, использующих карту, но единственное отличие здесь в том, что вы используете только часть BSI в df1 для соответствия

df1['marker'] = df1['BSI'].str.extract('(.*)-', expand = False).map(df2.set_index('initial').marker)



    BSI     Shelter_Number  Location                            Latitude    Longitude   marker
0   AA-010  1085            SUSSEX (N SIDE) & RIDEAU FALLS      45.439571   -75.695694  bo
1   AA-030  3690            SUSSEX (E SIDE) & ALEXANDER NS      45.442795   -75.692322  bo
2   AA-180  279             RICHTON (E SIDE) & BEECHWOOD FS     45.439556   -75.676849  bo
3   AA-200  2018            BEECHWOOD (S SIDE) & CHARLEVOIX NS  45.441154   -75.673622  bo
4   AA-220  3301            BEECHWOOD (S SIDE) & MAISONNEUVE NS 45.442188   -75.671356  bo
0 голосов
/ 22 мая 2018

Вы можете создать словарь из вашего df2 и затем сопоставить df1, чтобы создать новый столбец.Если все ваши записи в BSI имеют тот же формат, что и предоставленный, тогда просто выберите первые 2 буквы.Если это должно быть более сложным, как все до первого дефиса, тогда вы можете использовать регулярные выражения.

Вот некоторые тестовые данные

import pandas as pd
df1 = pd.DataFrame({'BSI': ['AA-010', 'AA-030', 'AA-180', 'AA-200', 'AA-220'],
                    'Latitude': [1, 2, 3, 4, 5]})
df2 = pd.DataFrame({'initial': ['AA', 'AB', 'AC', 'AD', 'AE'],
                    'marker': ['bo', 'bv', 'b^', 'b<', 'b>']})

Вот отображение

dct = pd.Series(df2.marker.values, index=df2.initial).to_dict()
df1['marker'] = df1['BSI'].str[0:2].map(dct)

      BSI  Latitude marker
0  AA-010         1     bo
1  AA-030         2     bo
2  AA-180         3     bo
3  AA-200         4     bo
4  AA-220         5     bo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...