Создать сводку для каждой строки на основе значений столбца - PullRequest
0 голосов
/ 17 декабря 2018

у меня есть такой фрейм данных.

import pandas as pd

raw_data = {'Sub1':['A','B','C','D','E'],
            'Sub2':['F','G','H','I','J'],
            'Sub3':['K','L','M','N','O'],
    'S_score1': [1, 0, 0, 6,0], 
    'S_score2': [0, 1, 0, 6,0], 
    'S_score3': [0, 1, 0, 6,0], 
    }

df2 = pd.DataFrame(raw_data, columns = ['Sub1','Sub2','Sub3','S_score1', 'S_score2', 'S_score3'])

есть фрейм данных

have

iхочет проверить столбцы оценки и проверить, превышает ли оценка 1, затем взять соответствующую тему в тексте.

Требуемый вывод:

wanted output

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Сначала отделите столбцы оценок от одного горячего столбца.

u = df2.filter(like='Sub')
v = df2.filter(like='S_score').astype(bool)

Затем объедините буквенные оценки умножением и установите значения столбцов.

r = (u.mul(v.values)
      .agg(','.join, axis=1)
      .str.strip(',')
      .str.replace(',{2,}', ','))
df2['s_text'] = np.where(r.str.len() > 0, 'You scored ' + r, 'N/A')    
df2

  Sub1 Sub2 Sub3  S_score1  S_score2  S_score3            s_text
0    A    F    K         1         0         0      You scored A
1    B    G    L         0         1         1    You scored G,L
2    C    H    M         0         0         0               N/A
3    D    I    N         6         6         6  You scored D,I,N
4    E    J    O         0         0         0               N/A

Чтобы сделать последний разделитель другим, вам понадобится пользовательская функция.

def join(lst):
    lst = lst[lst != '']
    if len(lst) > 1:
        return 'You scored ' + ', '.join(lst[:-1]) + ' and ' + lst[-1] 
    elif len(lst) > 0:
        return 'You scored ' + ', '.join(lst)
    return 'N/A'

df2['s_text'] = u.mul(v.values).agg(join, axis=1)
df2

  Sub1 Sub2 Sub3  S_score1  S_score2  S_score3                 s_text
0    A    F    K         1         0         0           You scored A
1    B    G    L         0         1         1     You scored G and L
2    C    H    M         0         0         0                    N/A
3    D    I    N         6         6         6  You scored D, I and N
4    E    J    O         0         0         0                    N/A
0 голосов
/ 17 декабря 2018

Одно из возможных решений состоит из следующих шагов:

  1. Определение функции, генерирующей выходной текст для строки исходного текста.Эта функция должна объединять исходные столбцы, отфильтрованные по ненулевым значениям.
  2. Создать subs таблицу, содержащую Sub1, Sub2 и Sub3.
  3. Создать msk (маску) таблицу, содержащуюS_score... столбцы и измените имена столбцов на Sub1, Sub2 и Sub3.
  4. Вычислите subs.where(msk) и примените вышеуказанную функцию к каждой строке.Обратите внимание, что для False элементов в маске соответствующий выходной элемент равен Нет , поэтому примененная функция не будет включать его в соединение.

Таким образом, весьСценарий может выглядеть так:

def txt(x):
    tbl = list(filter(lambda elem: not pd.isnull(elem), x))
    if len(tbl) > 0:
        return 'You have scored on ' + ', '.join(tbl)
    else:
        return 'You have not scored any subject'

subs = df.loc[:, :'Sub3']
msk = df.loc[:, 'S_score1':] > 0
msk.columns = ['Sub1', 'Sub2', 'Sub3']
df['s_text'] = subs.where(msk).apply(txt, axis=1)
0 голосов
/ 17 декабря 2018

Выполнение с join после нескольких

s=(df2.filter(like='Sub')*df2.filter(like='S_').ge(1).values).apply( lambda x : ','.join([y for y in x if y is not '']),axis=1)
s
Out[324]: 
0        A
1      G,L
2         
3    D,I,N
4         
dtype: object

Затем цепочка с np.where

np.where(s=='','You do not have score','You have'+s)
Out[326]: 
array(['You haveA', 'You haveG,L', 'You do not have score',
       'You haveD,I,N', 'You do not have score'], dtype=object)

#Assign it back 

df2['s_txt']=np.where(s=='','You do not have score','You have'+s)
df2
Out[328]: 
  Sub1 Sub2          ...           S_score3                  s_txt
0    A    F          ...                  0              You haveA
1    B    G          ...                  1            You haveG,L
2    C    H          ...                  0  You do not have score
3    D    I          ...                  6          You haveD,I,N
4    E    J          ...                  0  You do not have score
[5 rows x 7 columns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...