Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用str列进行赋值_Python_Pandas_Dataframe_Lambda_Assign - Fatal编程技术网

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
is
pandas.core.series.series
。正因为如此,分配被区别对待

f'{df.Firstname} {df.Surname}'
df.Firstname + ' ' + df.Surname