如何从一个数据框计算字符值并添加到另一个现有数据框?

时间:2019-03-20 19:50:17

标签: python pandas dataframe

我有两个现有的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'))

那将正确返回一个truefalse值,但是我不知道如何使用这些布尔值将其添加到我的空数据框中。

最好的行动方案是什么?除了stringnumpypandas之外,我不允许使用任何其他库。

1 个答案:

答案 0 :(得分:2)

使用字符串方法获取第一个和最后一个字符,然后获取crosstabpivotgroupbycrosstab较慢,但语法不错。

创建基本表:

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)

输出(前5行):

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))