获取列中给定的字符串(句子)的第一个字母,并在python中创建一个新列
我在pandas dataframe中有一个列,其中包含如下项:获取列中给定的字符串(句子)的第一个字母,并在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())]) 但是我找不到我想要的。有人能帮忙吗?您想对每一行应用一个函数,并返回一个新列及其结果。这种操作可以通
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 haddf['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 haddf['Abbrev']=df['Name'].str.split(expand=True)。apply(lambda x:x.str[0])。应用(“”.join)
但我觉得这样更好+1@EdChum我的第一个解决方案是,既然没有None,我就选择了sum。如果有两个不同的名字,Abrev的名字都是一样的,那么如何解决这个问题?如果名字的首字母相同,你希望输出什么?事实上,当我看到问题是,我的方法是熊猫式的,因为我们扩展了,速度要慢得多,如果有两个不同的名字,阿布列夫的名字都是一样的,如何解决这个问题?如果名字的首字母相同,你想要输出什么?事实上,当我看到这个问题时,我想到的是列表理解,我的方法是熊猫式的因为我们扩展它的速度要慢得多