我有一个数据框,我想计算在所有其他列中发生了多少次字符串(说“是”)。我想将count添加到新列中并将其称为“Yes-Count”。
我使用lamda并遵循示例Creating a new column based on if-elif-else condition
我很好奇这是否可以在一行中完成。
这是示例数据和代码。
import pandas as pd
def finalCount(row):
count = 0
if row['Col1'] == 'Yes':
count = count + 1
if row['Col2'] == 'Yes':
count = count + 1
if row['Col3'] == 'Yes':
count = count + 1
if row['Col4'] == 'Yes':
count = count + 1
return count
data = {
'Col1': ['Yes', 1, 'No', 'Yes'],
'Col2': ['Yes', 2, 'No', 'Yes'],
'Col3': ['No', 3, 'Yes', 'Yes'],
'Col4': ['Yes', 4, 'No', 'Yes'],
}
dfData = pd.DataFrame(data, columns= ['Col1','Col2','Col3','Col4'])
dfData['Yes-Count'] = dfData.apply(finalCount, axis =1)
我得到了预期的结果。
有没有办法摆脱finalCount方法并在一行中执行此操作?
答案 0 :(得分:3)
这是使用布尔掩码和sum的一种方法:
dfData["Yes-Count"] = dfData.eq('Yes').sum(axis=1)
print(dfData)
# Col1 Col2 Col3 Col4 Yes-Count
#0 Yes Yes No Yes 3
#1 1 2 3 4 0
#2 No No Yes No 1
#3 Yes Yes Yes Yes 4
<强>解释强>
dfData.eq("Yes")
返回一个形状相等的数据框,其布尔值表示该位置的值是否等于"Yes"
答案 1 :(得分:1)
以下是使用isin()
函数的另一种方法:
list_of_words = ['Yes']
dfData["Yes-Count"] = dfData.isin(list_of_words).sum(axis='columns')
使用此方法,您可以将DataFrame
元素与多个值进行比较。 isin()
函数返回一个布尔值DataFrame
,显示您的DataFrame
元素是否与list_of_words
中的任何字词匹配。