我有这样的数据帧。

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


有数据框

python - 根据列值为每一行生成摘要-LMLPHP

我想检查分数列,并检查分数是否大于1,然后在文本中选择相应的主题。

想要的输出:

python - 根据列值为每一行生成摘要-LMLPHP

最佳答案

首先,将等级列与一个热门列分开。

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

关于python - 根据列值为每一行生成摘要,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53820394/

10-12 18:41