我在这样的数据框中有一个字符串列。
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
但是在数据框的情况下无法应用它,有人可以帮助我在数据框中创建分数吗?
答案 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