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

2024-09-30 16:23:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个现有的pandas数据帧。一个数据帧是大约1000个单词的列表。这是数据帧的头部:

0
0   abase
1   abate
2   abdicate
3   abduct
4   aberration

我的第二个数据帧是一个空数据帧,有26行和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”结尾。所以,我需要将1添加到e和a在空数据帧上相遇的位置。我需要在整个第一个数据帧中系统地执行这个操作,但是我被卡住了

我试着用startswith和ends:

values = (input[0].str.startswith(r'a') & input[0].str.endswith(r'e'))

这将正确地返回truefalse值,但我不知道如何使用这些布尔值添加到空数据帧

最好的做法是什么?我不允许使用除stringnumpypandas以外的任何库


Tags: 数据pandas列表input结尾字母单词头部
1条回答
网友
1楼 · 发布于 2024-09-30 16:23:10

使用string方法获取第一个和最后一个字符,然后可能是crosstab,或者pivot或者groupbycrosstab比较慢,但是语法很好

创建基表:

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

相关问题 更多 >