Python Pandas dataframe изменяет значение столбца на основе функции, которая очищает строковое значение и присваивает новый столбец - PullRequest
0 голосов
/ 11 марта 2020

У меня есть определенные данные для очистки, это ключи, в которых у ключей есть шесть ведущих нулей, от которых я хочу избавиться, и если ключи не заканчиваются на «AB C» или не заканчиваются на «DEFG» ", тогда мне нужно убрать код валюты в последних 3 индексах. Если ключ не начинается с начальных нулей, просто верните ключ как есть.

Для этого я написал функцию, которая работает со строкой, как показано ниже:

def cleanAttainKey(dirtyAttainKey):

    if dirtyAttainKey[0] != "0":
        return dirtyAttainKey
    else:
        dirtyAttainKey = dirtyAttainKey.strip("0")

    if dirtyAttainKey[-3:] != "ABC" and dirtyAttainKey[-3:] != "DEFG":
        dirtyAttainKey =  dirtyAttainKey[:-3]
    cleanAttainKey = dirtyAttainKey
    return cleanAttainKey

Теперь Я создаю фиктивный фрейм данных, чтобы проверить его, но он сообщает об ошибках:

  1. фрейм данных
df = pd.DataFrame({'dirtyKey':["00000012345ABC","0000012345DEFG","0000023456DEFGUSD"],'amount':[100,101,102]},
                  columns=["dirtyKey","amount"])
Мне нужно получить новый столбец с именем «cleanAttainKey» в df, затем изменить каждое значение в «dirtyKey» с помощью функции «cleanAttainKey», затем назначить очищенный ключ новому столбцу «cleanAttainKey», однако, похоже, pandas не поддерживает этот тип модификации.
# add a new column in df called cleanAttainKey
df['cleanAttainKey'] = ""
# I want to clean the keys and get into the new column of cleanAttainKey
dirtyAttainKeyList = df['dirtyKey'].tolist()
for i in range(len(df['cleanAttainKey'])):
    df['cleanAttainKey'][i] = cleanAttainKey(vpAttainKeyList[i])

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

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

Результат должен совпадать с df2 ниже:

df2 = pd.DataFrame({'dirtyKey':["00000012345ABC","0000012345DEFG","0000023456DEFGUSD"],'amount':[100,101,102],
                  'cleanAttainKey':["12345ABC","12345DEFG","23456DEFG"]},
                  columns=["dirtyKey","cleanAttainKey","amount"])
df2

Есть ли лучший способ изменить грязные ключи и получить новый столбец с чистыми ключами в Pandas? Спасибо

1 Ответ

1 голос
/ 11 марта 2020

Вот виновник:

df['cleanAttainKey'][i] = cleanAttainKey(vpAttainKeyList[i])

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

Способ idiomati c заключается в использовании loc (или iloc или [i]at). :

df.loc[i, 'cleanAttainKey'] = cleanAttainKey(vpAttainKeyList[i])

(выше предполагается естественный индекс диапазона ...)

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