提问人:wick 提问时间:8/4/2023 更新时间:8/4/2023 访问量:45
计算 3 个不同字符串出现在多个列中的次数,并将此计数放在新列中
Counting the number of times 3 different strings appear over numerous columns and putting this count in a new column
问:
我正在尝试创建一个新列,以计算某人因工作而获得报酬的次数 - 无论是全部钱还是部分钱。因此,对于每一行,如果它在工作列中显示“是”或“部分”或“已付费”,那么我希望在新列中对此进行计数。
我的实际数据有 15 个不同的作业列,我想对它们进行“求和”。
所以之前看起来像:
名字 | 约伯记1 | 工作2 |
---|---|---|
汤姆 | 是的 | 不 |
缺口 | 部分 | 是的 |
朱莉 | 不 | 不 |
之后我想看起来像:
名字 | 约伯记1 | 工作2 | Received_money |
---|---|---|---|
汤姆 | 是的 | 不 | 1 |
缺口 | 部分 | 是的 | 2 |
朱莉 | 不 | 不 | 0 |
当前代码
df['Received_money'] = df[['Job1', 'Job2']].apply(lambda row: len(row[row == 'Yes']), axis=1)
这是我当前的代码,它部分地完成了我想要的。它加起来在列出的列中说“是”的次数。但:
- 我无法弄清楚如何将其扩展到包括 和 ,以及如何让它在每次发生这些时给 1 分(可以这么说)
"== 'partial'"
"== 'paid'"
- 有没有其他方法可以输入我的所有 15 列名称而不是 [['Job1', 'Job2', 'Job3', 'Job4', 'Job5'....'Job15' ]]
(示例数据)
import pandas as pd
# initialize list of lists
data = [['tom', "Yes", "No"], ['nick', "Partial", "Yes"], ['juli', "No", "No"]]
# Create the pandas DataFrame
df = pd.DataFrame(data, columns=['Name', 'Job1', 'Job2'])
谢谢!
答:
1赞
Suraj Shourie
8/4/2023
#1
你的方法似乎没问题。只需添加其他过滤器,如下所示:
df['Received_money'] = df[['Job1', 'Job2']].apply(lambda row: len(row[row == 'Yes']) +len(row[row == 'Partial']), axis=1)
1赞
code-sk
8/4/2023
#2
我添加了另外 2 个作业列仅用于测试。这应该满足您的要求。
data = [['tom', "Yes", "No","Partial","Paid"], ['nick', "Partial", "Yes"], ['juli', "No", "No","Partial","Paid"]]
df = pd.DataFrame(data, columns=['Name', 'Job1', 'Job2','Job3','Job4'])
job_cols =['Job1','Job2','Job3','Job4']
paid_values = ['Yes','Paid','Partial']
df['Received_money'] = df[job_cols].apply(lambda row : len([r for r in row if r in paid_values]),axis=1)
print(df)
评论
1赞
wick
8/4/2023
这真是太棒了!非常感谢
1赞
mozway
8/4/2023
#3
不要使用 ,您可以轻松地将其矢量化:apply
df['Received_money'] = df.filter(like='Job').isin(['Yes', 'Partial']).sum(axis=1)
或者,如果“作业”列不以文字“作业”开头:
cols = ['Job1', 'Job2']
df['Received_money'] = df[cols].isin(['Yes', 'Partial']).sum(axis=1)
输出:
Name Job1 Job2 Received_money
0 tom Yes No 1
1 nick Partial Yes 2
2 juli No No 0
评论