Анализ данных с использованием Pandas Numpy в Python

#python #pandas #dataframe #numpy #jupyter-notebook

#питон #панды #фрейм данных #тупица #юпитер-записная книжка

Вопрос:

У меня есть фрейм данных с 2 столбцами level1 и level2. Каждый номер учетной записи на уровне 1 связан с родительским идентификатором, найденным в столбце уровень 2. Для учетных записей, заканчивающихся на «8409» в столбце «уровень 1″, некоторые из них сопоставлены с неправильным родительским идентификатором на уровне 2. Чтобы найти правильный родительский код, вам нужно выполнить поиск на уровне 1, где вы замените все учетные записи, заканчивающиеся на»8409», на «8400». Затем он найдет эквивалентную учетную запись в том же столбце. Если найдено совпадение, скопируйте то, что находится в столбце «уровень 2», и замените его в столбце для учетных записей, заканчивающихся на «8409».

 import pandas as pd import numpy as np df = pd.DataFrame([[7854568400,489],  [9632588400,126],  [3699633691,189],  [9876543697,987],  [1111118409,987],  [7854568409,396],  [7854567893,897],   [9632588409,147]], columns = ['level1','level2']) df  

Приведенное ниже решение позволило создать новый столбец «new_level2» для решения вышеуказанной проблемы.

 maps = df.set_index('level1')['level2'] s = df['level1'].astype(str).str.replace('8409

В выводе ниже на счете "7854568409" уровень 2 был изменен с 396 на 489 (взято из строки 0), а на счете "9632588409" уровень 2 был изменен со 147 на 126 (взято из строки 1).

 level1 level2 new_level2 0 7854568400 489 489 1 9632588400 126 126 2 3699633691 189 189 3 9876543697 987 987 4 1111118409 987 987 5 7854568409 396 489 6 7854567893 897 897 7 9632588409 147 126  

Однако, когда я применяю вышеупомянутое решение с дополнительными переменными, именно здесь я сталкиваюсь с проблемами, в основном, когда я добавляю валюту в фрейм данных. Замена значений level2 применяется ТОЛЬКО к долларам США, все остальные валюты должны сохранять свое текущее значение в столбце level2.

Новый DF

 df = pd.DataFrame([['USD',7854568400,489],  ['USD',9632588400,126],  ['USD',3699633691,189],  ['USD',9876543697,987],  ['EUR',1111118400,120],  ['EUR',1111118409,987],  ['USD',1111118409,987],  ['USD',7854568409,396],  ['USD',7854567893,897],   ['USD',9632588409,147]], columns = ['cur','level1','level2'])  

I get the following error when i attempt to apply the above solution to the new dataframe that contains the currency. InvalidIndexError: Reindexing only valid with uniquely valued Index objects

Its worth noting that you can have the same account number across different currencies.

Desired output is below. Only 2 accounts (Index 7 amp; 9) should have their level2 changed. Index 4 and 5 should retain its original level2 value because they are euro and not in scope, and Index 6 because there was no corresponding match found for this account, therefore it retains it original value.

 cur level1 level2 new_level2 0 USD 7854568400 489 489 1 USD 9632588400 126 126 2 USD 3699633691 189 189 3 USD 9876543697 987 987 4 EUR 1111118400 120 120 5 EUR 1111118409 987 987 6 USD 1111118409 987 987 7 USD 7854568409 396 489 8 USD 7854567893 897 897 9 USD 9632588409 147 126  

Мы будем очень признательны за любую помощь.


, '8400', regex=True).astype('int64') df['new_level2'] = s.map(maps).combine_first(df['level2']).convert_dtypes()
В выводе ниже на счете «7854568409» уровень 2 был изменен с 396 на 489 (взято из строки 0), а на счете «9632588409» уровень 2 был изменен со 147 на 126 (взято из строки 1).


Однако, когда я применяю вышеупомянутое решение с дополнительными переменными, именно здесь я сталкиваюсь с проблемами, в основном, когда я добавляю валюту в фрейм данных. Замена значений level2 применяется ТОЛЬКО к долларам США, все остальные валюты должны сохранять свое текущее значение в столбце level2.

Новый DF


I get the following error when i attempt to apply the above solution to the new dataframe that contains the currency. InvalidIndexError: Reindexing only valid with uniquely valued Index objects

Its worth noting that you can have the same account number across different currencies.

Desired output is below. Only 2 accounts (Index 7 amp; 9) should have their level2 changed. Index 4 and 5 should retain its original level2 value because they are euro and not in scope, and Index 6 because there was no corresponding match found for this account, therefore it retains it original value.


Мы будем очень признательны за любую помощь.