Python 使用str列进行赋值
我非常喜欢Python 使用str列进行赋值,python,pandas,dataframe,lambda,assign,Python,Pandas,Dataframe,Lambda,Assign,我非常喜欢pandas.assign()函数,尤其是与lambda表达式结合使用时。 然而,在处理字符串连接时,我遇到了一个未知的行为,我还不明白。我找到了这条线索,但它没有回答我的问题: 我的问题的最小工作示例: 将熊猫作为pd导入 df=pd.DataFrame({'Firstname':['Sandy','Peter','Dolly'], “姓氏”:[“阳光”、“帕克”、“哑巴”]) 返回 Firstname姓氏 0沙质阳光 1彼得·帕克 2多莉哑巴 现在,如果我想分配,例如,全名,
pandas.assign()
函数,尤其是与lambda
表达式结合使用时。
然而,在处理字符串连接时,我遇到了一个未知的行为,我还不明白。我找到了这条线索,但它没有回答我的问题:
我的问题的最小工作示例:
将熊猫作为pd导入
df=pd.DataFrame({'Firstname':['Sandy','Peter','Dolly'],
“姓氏”:[“阳光”、“帕克”、“哑巴”])
返回
Firstname姓氏
0沙质阳光
1彼得·帕克
2多莉哑巴
现在,如果我想分配,例如,全名
,我想我可以简单地做:
df=df.assign(**{'Full Name':lambda x:f'{x.Firstname}{x.lasname}})
但这不仅仅是基于每一行(如预期)创建一个新字符串,如“Sandy Sunshine”,而是基于所有行,如以下所示:
谁能解释一下为什么我的方法不起作用,为什么会这样
df=df.assign(**{'Full Name':lambda x:x.Firstname+''+x.lasname})
显然有效?谢谢:)在pandas
f-string
s中,用于组合字符串的工作元素是正确的,因为不存在针对数组的解决方案
因此,在您的解决方案中,将所有系列
(df中的列)组合在一起
如果需要使用f-string
s,一种可能的解决方案是在压缩列中循环pro分别处理每一对:
df = df.assign(**{'Full Name': lambda x: [f'{Firstname} {Surname}'
for Firstname, Surname in
zip(x['Firstname'], x['Surname'])]})
print (df)
Firstname Surname Full Name
0 Sandy Sunshine Sandy Sunshine
1 Peter Parker Peter Parker
2 Dolly Dumb Dolly Dumb
因此,f'{x.Firstname}{x.lasname}'
的输出将是
0 Sandy
1 Peter
2 Dolly
Name: Firstname, dtype: object 0 Sunshine
1 Parker
2 Dumb
Name: Surname, dtype: object
现在df.assign(新列='a')
将输出:
Firstname Surname new_col
0 Sandy Sunshine a
1 Peter Parker a
2 Dolly Dumb a
这就是为什么每行都有下面的字符串
0 Sandy
1 Peter
2 Dolly
Name: Firstname, dtype: object 0 Sunshine
1 Parker
2 Dumb
Name: Surname, dtype: object
在第二种情况下:
df.assign(**{'Full Name': lambda x: x.Firstname + ' ' + x.Surname})
相当于
df.assign(Full_name = df['Firstname'] + ' ' + df['Surname']
它只是字符串连接元素,所以它可以按预期工作
您可以在这里使用pd.Series.str.cat
df['Full Name'] = df['Firstname'].str.cat(df['Surname'],sep=' ')
结果
f'{df.Firstname} {df.Surname}'
具有类型str
,是熊猫系列的字符串表示形式,而
df.Firstname + ' ' + df.Surname
ispandas.core.series.series
。正因为如此,分配被区别对待
f'{df.Firstname} {df.Surname}'
df.Firstname + ' ' + df.Surname