Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.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中创建一个新列_Python_Pandas - Fatal编程技术网

获取列中给定的字符串(句子)的第一个字母,并在python中创建一个新列

获取列中给定的字符串(句子)的第一个字母,并在python中创建一个新列,python,pandas,Python,Pandas,我在pandas dataframe中有一个列,其中包含如下项: SubBrand Sam William Mathew Jonty Rodes Chris Gayle 我想创建一个新列(SubBrand_new),例如 我正在使用这段代码 df1["SubBrand_new"] = "".join([x[0] for x in (df1["SubBrand"].str.split())]) 但是我找不到我想要的。有人能帮忙吗?您想对每一行应用一个函数,并返回一个新列及其结果。这种操作可以通

我在pandas dataframe中有一个列,其中包含如下项:

SubBrand
Sam William Mathew
Jonty Rodes
Chris Gayle
我想创建一个新列(SubBrand_new),例如

我正在使用这段代码

df1["SubBrand_new"] = "".join([x[0] for x in (df1["SubBrand"].str.split())])

但是我找不到我想要的。有人能帮忙吗?

您想对每一行应用一个函数,并返回一个新列及其结果。这种操作可以通过
.apply()
方法应用,一个简单的
=
属性不会起作用。符合代码精神的解决方案是:

df = pd.DataFrame({'Name': ['Marcus Livius Drussus',
                            'Lucius Cornelius Sulla',
                            'Gaius Julius Caesar']})
df['Abrev'] = df.Name.apply(lambda x: "".join([y[0] for y in (x.split())]))
产生

df
    Name                    Abrev
0   Marcus Levius Drussus   MLD
1   Lucius Cornelius Sulla  LCS
2   Gaius Julius Caesar     GJC
编辑:

我将它与另一个解决方案进行了比较,认为使用
join()
apply()
方法会非常慢。我惊讶地发现它实际上更快。设置:

N = 3000000
bank = pd.util.testing.rands_array(3,N)
vec = [bank[3*i] + ' ' + bank[3*i+1] + ' ' + bank[3*i+2]  for i in range(N/3)]
df = pd.DataFrame({'Name': vec})
我发现:

df.Name.apply(lambda x: "".join([y[0] for y in (x.split())]))
executed in 581ms

df.Name.str.split(expand=True).apply(lambda x : x.str[0]).fillna('').sum(1)
executed in 2.81s

您希望对每一行应用一个函数,并返回一个新列及其结果。这种操作可以通过
.apply()
方法应用,一个简单的
=
属性不会起作用。符合代码精神的解决方案是:

df = pd.DataFrame({'Name': ['Marcus Livius Drussus',
                            'Lucius Cornelius Sulla',
                            'Gaius Julius Caesar']})
df['Abrev'] = df.Name.apply(lambda x: "".join([y[0] for y in (x.split())]))
产生

df
    Name                    Abrev
0   Marcus Levius Drussus   MLD
1   Lucius Cornelius Sulla  LCS
2   Gaius Julius Caesar     GJC
编辑:

我将它与另一个解决方案进行了比较,认为使用
join()
apply()
方法会非常慢。我惊讶地发现它实际上更快。设置:

N = 3000000
bank = pd.util.testing.rands_array(3,N)
vec = [bank[3*i] + ' ' + bank[3*i+1] + ' ' + bank[3*i+2]  for i in range(N/3)]
df = pd.DataFrame({'Name': vec})
我发现:

df.Name.apply(lambda x: "".join([y[0] for y in (x.split())]))
executed in 581ms

df.Name.str.split(expand=True).apply(lambda x : x.str[0]).fillna('').sum(1)
executed in 2.81s

我们可以用展开和求和进行拆分,即

df['SubBrand'].str.split(expand=True).apply(lambda x : x.str[0]).fillna('').sum(1)

0    SWM
1     JR
2     CG
dtype: object

我们可以用展开和求和进行拆分,即

df['SubBrand'].str.split(expand=True).apply(lambda x : x.str[0]).fillna('').sum(1)

0    SWM
1     JR
2     CG
dtype: object

哈哈,我有完全相同的版本:
df.SubBrand.str.split(expand=True).apply(lambda c:c.str[0]).fillna(“”).sum(1)
,但是你更快了:-DI had
df['Abbrev']=df['Name'].str.split(expand=True).apply(lambda x:x.str[0]).apply(“”.join)
但我觉得这样更好+1@EdChum我的第一个解决方案是,因为没有
None
我选择了sumha-ha,所以我的版本完全相同:
df.SubBrand.str.split(expand=True)。apply(lambda c:c.str[0])。fillna(“”)。sum(1)
,但是你更快了:-DI had
df['Abbrev']=df['Name'].str.split(expand=True)。apply(lambda x:x.str[0])。应用(“”.join)
但我觉得这样更好+1@EdChum我的第一个解决方案是,既然没有None,我就选择了sum。如果有两个不同的名字,Abrev的名字都是一样的,那么如何解决这个问题?如果名字的首字母相同,你希望输出什么?事实上,当我看到问题是,我的方法是熊猫式的,因为我们扩展了,速度要慢得多,如果有两个不同的名字,阿布列夫的名字都是一样的,如何解决这个问题?如果名字的首字母相同,你想要输出什么?事实上,当我看到这个问题时,我想到的是列表理解,我的方法是熊猫式的因为我们扩展它的速度要慢得多