我有这样的数据帧。
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'])
有数据框
我想检查分数列,并检查分数是否大于1,然后在文本中选择相应的主题。
想要的输出:
最佳答案
首先,将等级列与一个热门列分开。
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/