Замена значений на месте в pandas кадре данных не работает с .replace () - PullRequest
0 голосов
/ 12 марта 2020

У меня есть набор данных с различными сеточными станциями и их соединениями с другими станциями сетки, и мне нужно наметить линии передачи из этих данных. Это выглядит примерно так (в исходном фрейме данных около 100 или около того строк):

>df

    Name    Latitude    Longitude   Link 1  Link 2  Link 3  Link 4  Link 5  
0   A       34.466667   72.200000   B       NaN     NaN     NaN     NaN 
1   B       33.766667   72.366667   A       C       D       NaN     NaN
2   C       33.761500   72.434000   B       E       G       NaN     NaN

Чтобы упростить задачу, я создал новый фрейм данных, проиндексированный с такими именами:

>datax

        Latitude    Longitude   Link 1  Link 2  Link 3  Link 4  Link 5
Name                                                    
A       34.466667   72.200000   B       NaN     NaN     NaN     NaN 
B       33.766667   72.366667   A       C       D       NaN     NaN
C       33.761500   72.434000   B       E       G       NaN     NaN

Я размечаю линии, используя «Связи» каждой станции сетки, которые показывают мне другие станции сетки, к которым она подключена. Поскольку каждая сеточная станция показывает свою связь с другими, чтобы правильно отобразить линии, мне нужно исключить дубликаты, например, если я отображаю первую строку между А и В путем итерации по первому столбцу кадра данных, мне нужно устранить эта ссылка (т.е. удалить «A» в столбце «Ссылка 1» во второй строке) во второй строке, чтобы строка не дублировалась, когда я выполняю итерацию по второй строке. Чтобы выполнить sh, я попытался использовать replace,

datax.loc[datax.iloc[0]['Link 1']].replace(datax.index[0],np.nan)

Этот фрагмент заменяет ссылку и вставляет nan, но не делает этого на месте в исходном кадре данных, поэтому я попробовал встроенный аргумент на месте,

datax.loc[datax.iloc[0]['Link 1']].replace(datax.index[0],np.nan, inplace=True)

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

Редактировать:

Когда я запускаю приведенный выше фрагмент кода, я хочу, чтобы «Ссылка 1» во втором столбце информационного кадра стала NaN.

>datax

        Latitude    Longitude   Link 1  Link 2  Link 3  Link 4  Link 5
Name                                                    
A       34.466667   72.200000   B       NaN     NaN     NaN     NaN 
B       33.766667   72.366667   Nan     C       D       NaN     NaN
C       33.761500   72.434000   NaN     E       G       NaN     NaN

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

1 Ответ

2 голосов
/ 12 марта 2020

Вот одно из решений.

Шаг 1 - Первый шаг - сортировка значений «Имя» и «Ссылка 1» вдоль оси столбца.

datax[['Name', 'Link 1']].apply(sorted, axis=1)

Это дает вам список как это

0    [A, B]
1    [A, B]
2    [B, C]

Шаг 2 - Затем вам нужно преобразовать их в строки (списки beacuse не принимаются, когда вы используете df.duplicated()), используя .apply(lambda x: ','.join(map(str, x)))

Шаг 3 - Далее найдите дубликаты, используя df.duplicated(), и сохраните их в новом столбце «temp».

datax['temp'] = datax[['Name', 'Link 1']].apply(sorted, axis=1).apply(lambda x: ','.join(map(str, x))).duplicated(keep='first')

На этом этапе ваш df datax будет

  Name   Latitude  Longitude Link 1 Link 2 Link 3  Link 4  Link 5   temp
0    A  34.466667  72.200000      B    NaN    NaN     NaN     NaN  False
1    B  33.766667  72.366667    NaN      C      D     NaN     NaN   True
2    C  33.761500  72.434000      B      E      G     NaN     NaN  False

Шаг 4 - Теперь вы можете использовать np.where() и проверить, если datax['temp'] имеет значение True и присваивает datax['Link 1'] соответственно

datax['Link 1'] = np.where(datax['temp']==True, np.NaN, datax['Link 1'])

Шаг 5 - После этого можно удалить столбец temp, используя datax.drop('temp', axis=1)

Вывод:

  Name   Latitude  Longitude Link 1 Link 2 Link 3  Link 4  Link 5
0    A  34.466667  72.200000      B    NaN    NaN     NaN     NaN
1    B  33.766667  72.366667    NaN      C      D     NaN     NaN
2    C  33.761500  72.434000      B      E      G     NaN     NaN

Объединение всех этих шагов -

datax['temp'] = datax[['Name', 'Link 1']].apply(sorted, axis=1).apply(lambda x: ','.join(map(str, x))).duplicated(keep='first')
datax['Link 1'] = np.where(datax['temp']==True, np.NaN, datax['Link 1'])
datax.drop('temp', axis=1)

Окончательное решение - Мы можем расширить это решение для сравнения каждый из «Link 1», «Link 2», «Link 3» и т. д. c с «Name» и установите столбцы «Link 1», «Link 2», «Link 3» соответственно.

for column in datax[['Link 1','Link 2','Link 3','Link 4','Link 5']]:
    datax['temp'] = datax[['Name', column]]\
        .fillna('').apply(sorted, axis=1)\
        .apply(lambda x: ','.join(map(str, x)))\
        .duplicated(keep='first')
    datax[column] = np.where(datax['temp']==True, np.NaN, datax[column])
    datax.drop('temp', axis=1, inplace=True)

print(datax)

Вывод:

  Name   Latitude  Longitude Link 1 Link 2 Link 3  Link 4  Link 5
0    A  34.466667  72.200000      B    NaN    NaN     NaN     NaN
1    B  33.766667  72.366667    NaN      C      D     NaN     NaN
2    C  33.761500  72.434000      B      E      G     NaN     NaN

Дайте мне знать, если это поможет !!

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