Обновите столбец в одном фрейме данных с условием из другого фрейма данных в Python без цикла For - PullRequest
0 голосов
/ 15 января 2020

У меня есть один фрейм данных, который загружает центральный файл. Новые файлы ежемесячно обновляются здесь. Поскольку в файле, который копируется во фрейм данных, отсутствует несколько пропущенных столбцов, я создал отображающий фрейм данных, который добавляет значения к фрейму данных при выполнении условия для пропущенных столбцов.

Ниже приведен пример центрального файла:

ID	Region	Country	Code	User	Order Price
1		Germany		ABC	2342545
2		Italy		DEF	5464545
3		USA		GHI	3245325
4		India		JKL	676565
5		Mexico		MNO	3443252
6		China		PQR	565445
7		Germany		STU	765765
8		Mexico		VWX	564566
9		China		YZA	346534
10		India		BCD	5675765

Это мой файл сопоставления для отсутствующего региона и кода

Country	Region	Code
Germany	EU	1
Italy	EU	2
USA	America	3
India	Asia	4
Mexico	America	5
China	Asia	6

Вот ожидаемый результат:

ID	Region	Country	Code	User	Order Price
1	EU	Germany	1	ABC	2342545
2	EU	Italy	2	DEF	5464545
3	America	USA	3	GHI	3245325
4	Asia	India	4	JKL	676565
5	America	Mexico	5	MNO	3443252
6	Asia	China	6	PQR	565445
7	EU	Germany	2	STU	765765
8	America	Mexico	5	VWX	564566
9	Asia	China	6	YZA	346534
10	Asia	India	4	BCD	5675765

Что я сделал, это использовал для циклов с iterrows () для обновления значений во фрейме данных.

Проблема в том, что это очень медленно и для обновления около 60 000 записей требуется около часа или более.

вот мой код:

        for central_update_index, central_update_row in central_bridge_file.iterrows():
        print('index: ', central_update_index)
        for bridge_match_index, bridge_match_row in central_bridge_matching_file.iterrows():
            if bridge_match_row['Country'] == central_update_row['Country']:
                if central_update_row['Country / Company (P2)'] == bridge_match_row['Country']:
                    central_bridge_file.loc[central_update_index, 'Code'] = \
                        bridge_match_row['Code']
                    central_bridge_file.loc[central_update_index, 'Region'] = bridge_match_row[
                        'Region']

Может кто-нибудь помочь мне в том, как я могу написать лямбда-оператор или что-то, что может сделать это в течение нескольких минут?

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Give df,

   ID  Region  Country  Code User  Order Price
0   1     NaN  Germany   NaN  ABC      2342545
1   2     NaN    Italy   NaN  DEF      5464545
2   3     NaN      USA   NaN  GHI      3245325
3   4     NaN    India   NaN  JKL       676565
4   5     NaN   Mexico   NaN  MNO      3443252
5   6     NaN    China   NaN  PQR       565445
6   7     NaN  Germany   NaN  STU       765765
7   8     NaN   Mexico   NaN  VWX       564566
8   9     NaN    China   NaN  YZA       346534
9  10     NaN    India   NaN  BCD      5675765

и df_map,

   Country   Region  Code
0  Germany       EU     1
1    Italy       EU     2
2      USA  America     3
3    India     Asia     4
4   Mexico  America     5
5    China     Asia     6

Вы можете merge эти два кадра данных в 'Country':

df[['ID','Country','User','Order Price']].merge(df_map)

Output :

   ID  Country User  Order Price   Region  Code
0   1  Germany  ABC      2342545       EU     1
1   7  Germany  STU       765765       EU     1
2   2    Italy  DEF      5464545       EU     2
3   3      USA  GHI      3245325  America     3
4   4    India  JKL       676565     Asia     4
5  10    India  BCD      5675765     Asia     4
6   5   Mexico  MNO      3443252  America     5
7   8   Mexico  VWX       564566  America     5
8   6    China  PQR       565445     Asia     6
9   9    China  YZA       346534     Asia     6
0 голосов
/ 15 января 2020

Если вы хотите полностью заменить столбцы Region и Code в своих данных, вы можете выполнить слияние:

df = (df.drop(['Region','Code'], axis=1)
        .merge(mapping, on='Country', how='left')
     )

Если вы хотите обновить только эти столбцы, например, сохранить старые значения затем

mapping = mapping.set_index('Country')

for c in ['Region', 'Code']:
    df[c] = df[c].fillna(df['Country'].map(mapping[c]))

Вывод:

   ID   Region  Country  Code User  Order Price
0   1       EU  Germany   1.0  ABC      2342545
1   2       EU    Italy   2.0  DEF      5464545
2   3  America      USA   3.0  GHI      3245325
3   4     Asia    India   4.0  JKL       676565
4   5  America   Mexico   5.0  MNO      3443252
5   6     Asia    China   6.0  PQR       565445
6   7       EU  Germany   1.0  STU       765765
7   8  America   Mexico   5.0  VWX       564566
8   9     Asia    China   6.0  YZA       346534
9  10     Asia    India   4.0  BCD      5675765
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...