Как рассчитать символьные значения из одного кадра данных и добавить в другой существующий кадр данных? - PullRequest
1 голос
/ 20 марта 2019

У меня есть два существующих 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».Итак, мне нужно добавить 1 к месту, где e и встретиться на пустом кадре данных.Мне нужно делать это систематически на протяжении всего первого кадра данных, но я застрял.

Я попытался использовать начальный и заканчивается:

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

Это возвращает менязначение true или false правильно, но я не знаю, как использовать эти логические значения для добавления в мой пустой фрейм данных.

Как лучше всего действовать?Мне не разрешается использовать любые библиотеки, кроме string, numpy и pandas.

1 Ответ

2 голосов
/ 20 марта 2019

Используйте строковые методы для получения 1-го и последнего символа, затем возможно 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)

Вывод (первые 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...