我有两个现有的pandas
数据帧。一个数据框是大约1000个单词的列表。这是该数据框的标题:
0
0 abase
1 abate
2 abdicate
3 abduct
4 aberration
我的第二个数据框是一个空的数据框,具有26行和对应于字母的列:
End a b c d e f g h i j ... q r s t u v w x y z
Start
a 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
b 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
c 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
d 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
e 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
f 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
g 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
h 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
i 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
j 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
k 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
l 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
m 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
n 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
o 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
p 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
q 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
r 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
s 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
t 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
u 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
v 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
w 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
x 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
y 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
z 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
对于第一个数据帧中的每个单词,我应该辨别它们以什么字母开头和结尾,然后将1添加到空数据帧中的相应行和列。
例如:abase
以'a'开头,以'e'结尾。因此,我需要在空数据帧上e和a相遇的位置加1。我需要在整个第一个数据帧中系统地执行此操作,但是我遇到了麻烦。
我尝试使用startswith并以以下结尾:
values = (input[0].str.startswith(r'a') & input[0].str.endswith(r'e'))
那将正确返回一个true
或false
值,但是我不知道如何使用这些布尔值将其添加到我的空数据框中。
最好的行动方案是什么?除了string
,numpy
和pandas
之外,我不允许使用任何其他库。
答案 0 :(得分:2)
使用字符串方法获取第一个和最后一个字符,然后获取crosstab
或pivot
或groupby
。 crosstab
较慢,但语法不错。
import string
import pandas as pd
l = list(string.ascii_lowercase)
df_base = (pd.DataFrame(index=l, columns=l).fillna(0)
.rename_axis('Start', axis=0)
.rename_axis('End', axis=1))
df = df.assign(Start=df[0].str[0], End=df[0].str[-1])
to_add = pd.crosstab(df.Start, df.End)
#to_add = df.pivot_table(index='Start', columns='End', aggfunc='size')
#to_add = df.groupby(['Start', 'End']).size().unstack(-1)
#End e n t
#Start
#a 3 1 1
df_base = df_base.add(to_add, fill_value=0)
End a b c d e f ... x y z
Start
a 0.0 0.0 0.0 0.0 3.0 0.0 ... 0.0 0.0 0.0
b 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0
c 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0
d 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0
e 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0
尽管在这种情况下,不需要df_base
,而您可以两次reindex
:
(to_add.reindex(list(string.ascii_lowercase), axis=1)
.reindex(list(string.ascii_lowercase), axis=0)
.fillna(0))