Создать столбцы с .apply () Pandas со строками - PullRequest
1 голос
/ 23 марта 2020

У меня есть Dataframe df.

Один из столбцов называется Adress и содержит строку.

Я создал функцию processing(string), которая принимает в качестве аргумента a строка a возвращает часть этой строки.

Мне удалось применить функцию к df и создать новый столбец в df с помощью:

df.loc[:, 'new_col_name`] = df.loc[:, 'Adress`].apply(processing)

Я изменил свою функцию processing(string) таким образом, он возвращает две строки. Я хотел бы, чтобы вторая возвращенная строка была сохранена в другом новом столбце. Для этого я попытался выполнить следующие шаги: Создать несколько pandas столбцов DataFrame, применив функцию с несколькими возвращаемыми значениями

Вот пример моей функции processing(string):

def processing(string):
    #some processing
    return [A_string, B_string]

Я также попытался вернуть две строки в tuple.

Вот несколько способов применения этой функции к моей df:

df.loc[:, '1st_new_col'], df.loc[:, '2nd_new_col'] = df.loc[:, 'Adress'].apply(processing)
>>> ValueError: too many values to unpack (expected 2)

#or

df.loc[:, '1st_new_col'], df.loc[:, '2nd_new_col'] = df.loc[:, 'Adress'].astype(str).apply(processing)
>>> ValueError: too many values to unpack (expected 2)

#or

df.loc[:, ['1st_new_col', '2nd_new_col']] = df.loc[:, 'Adress'].apply(processing)
>>> KeyError: "None of [Index(['1st_new_col', '2nd_new_col'], dtype='object')] are in the [columns]"

#or

df.loc[:, ['1st_new_col', '2nd_new_col']] = df.loc[:, 'Adress'].apply(processing, axis=1)
>>> TypeError: processing() got an unexpected keyword argument 'axis'

#or

df.loc[:, ['1st_new_col', '2nd_new_col']] = df.apply(lambda x: processing(x['Adress'], axis=1)
>>> KeyError: "None of [Index(['1st_new_col', '2nd_new_col'], dtype='object')] are in the [columns]"

#or

df.loc[:, ['1st_new_col', '2nd_new_col']] = df.apply(lambda x: processing(x['Adress'].astype(str), axis=1)
>>> AttributeError: 'str' object has no attribute 'astype'
#This is the only Error I could understand

#or

df.loc[:, ['1st_new_col', '2nd_new_col']] = df.apply(lambda x: processing(x['Adress'])
>>> KeyError: 'Adress'

Мне кажется, я близок, но понятия не имею, как его получить.

Ответы [ 2 ]

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

Попробуйте:

 df["Adress"].apply(process)

Кроме того, лучше возвращать pd.Series в функции apply.

Вот один пример:

# build example dataframe
df = pd.DataFrame(data={'Adress' : ['Word_1_1 Word_1_2','Word_2_1 Word_2_2','Word_3_1 Word_3_2','Word_4_1 Word_4_2']}) 
print(df)
#               Adress
# 0  Word_1_1 Word_1_2
# 1  Word_2_1 Word_2_2
# 2  Word_3_1 Word_3_2
# 3  Word_4_1 Word_4_2

# Define your own function : here return two elements
def process(my_str):
    l = my_str.split(" ")
    return pd.Series(l)

# Apply the function and store the output in two new columns
df[["new_col_1", "new_col_2"]] = df["Adress"].apply(process)
print(df)
#               Adress new_col_1 new_col_2
# 0  Word_1_1 Word_1_2  Word_1_1  Word_1_2
# 1  Word_2_1 Word_2_2  Word_2_1  Word_2_2
# 2  Word_3_1 Word_3_2  Word_3_1  Word_3_2
# 3  Word_4_1 Word_4_2  Word_4_1  Word_4_2
0 голосов
/ 23 марта 2020

Вы можете попробовать это.

df['new_column'] = df.apply(lambda row: processing(row['Address']), axis=1)

или это.

df['new_column'] = df['Address'].apply(lambda value: processing(value))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...