计算 3 个不同字符串出现在多个列中的次数,并将此计数放在新列中

Counting the number of times 3 different strings appear over numerous columns and putting this count in a new column

提问人:wick 提问时间:8/4/2023 更新时间:8/4/2023 访问量:45

问:

我正在尝试创建一个新列,以计算某人因工作而获得报酬的次数 - 无论是全部钱还是部分钱。因此,对于每一行,如果它在工作列中显示“是”或“部分”或“已付费”,那么我希望在新列中对此进行计数。

我的实际数据有 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. 我无法弄清楚如何将其扩展到包括 和 ,以及如何让它在每次发生这些时给 1 分(可以这么说)"== 'partial'""== 'paid'"
  2. 有没有其他方法可以输入我的所有 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'])

谢谢!

Python Pandas 数据清理 -特征工程

评论


答:

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