首页 > 解决方案 > 使用 .apply() 创建列 带有字符串的 Pandas

问题描述

我有一个 Dataframe df

其中一列被命名Adress并包含一个字符串。

我创建了一个函数processing(string),它以字符串 a 作为参数返回该字符串的一部分。

我成功地将函数应用于 df 并在其中创建了一个新列df

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

我以返回两个字符串的方式修改了我的函数processing(string)。我希望返回的第二个字符串存储在另一个新列中。为此,我尝试按照中给出的步骤:通过应用具有多个返回的函数创建多个熊猫数据框列

这是我的功能的一个例子processing(string)

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

我还尝试在 a 中返回两个字符串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'

我想我很接近,但我不知道如何获得它。

标签: python-3.xstringpandasapplypandas-apply

解决方案


尝试:

 df["Adress"].apply(process)

此外,最好pd.Seriesapply函数中返回 a 。

这里有一个例子:

# 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

推荐阅读