想要使用实际位置和按字母顺序排列位置的总和为python中的数据框中的列创建分数

时间:2017-09-08 08:02:16

标签: python python-3.x pandas

我在这样的数据框中有一个字符串列。 raw_data = {'first_name': ['Jason', 'Aravind', 'Netaji', 'Swamiji', 'Ramakrishna', 'Jake']} df = pd.DataFrame(raw_data, columns = ['first_name'])

我想为每个细胞创建一个分数,分数的定义如下: Jason得分=(1 * 10 + 2 * 1 + 3 * 19 + 4 * 15 + 5 * 14)= 199。 类似地,对于ABc,分数将是(1 * 1 + 2 * 2 + 3 * 3)= 14

我使用以下代码为每个字母创建了不同的列:

df['len']=df['first_name'].str.len()
l=df['len'].max()
for i in range(0,l):
    df[i+1]=df.first_name.str[i]

并且还发现使用ord()如下我们也可以得到位置

a = 'Arun'
a=a.lower()
i= 1
for char in a:
   asc = ord(char)-96
   print(char,asc, i, asc*i)
   i = i+1

但是在数据框的情况下无法应用它,有人可以帮助我在数据框中创建分数吗?

2 个答案:

答案 0 :(得分:1)

您可以使用自定义功能和列表理解的第一个lower

def f(x):
    return sum(i * (ord(char) - 96) for i, char in enumerate(x, 1))

df['new'] = df['first_name'].str.lower().apply(f)
print(df)
    first_name  new
0        Jason  199
1      Aravind  285
2       Netaji  192
3      Swamiji  288
4  Ramakrishna  664
5         Jake   65

列表理解解决方案:

a = [sum(i * (ord(char) - 96) for i, char in enumerate(x, 1))
     for x in df['first_name'].str.lower()]
print(a)
[199, 285, 192, 288, 664, 65]

df['new'] = a
print(df)
    first_name  new
0        Jason  199
1      Aravind  285
2       Netaji  192
3      Swamiji  288
4  Ramakrishna  664
5         Jake   65

答案 1 :(得分:0)

一种方法是

In [783]: from string import ascii_lowercase

In [784]: score = lambda x: sum(i*(ascii_lowercase.index(l)+1) for i, l in enumerate(x, 1))

In [785]: df.first_name.str.lower().apply(score)
Out[785]:
0    199
1    285
2    192
3    288
4    664
5     65
Name: first_name, dtype: int64