Python Pandas Dataframe将列创建为另一列中出现的字符串数

时间:2018-04-10 18:46:00

标签: python pandas dataframe

我有一个数据框,我想计算在所有其他列中发生了多少次字符串(说“是”)。我想将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)

我得到了预期的结果。

enter image description here

有没有办法摆脱finalCount方法并在一行中执行此操作?

2 个答案:

答案 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 :(得分:1)

以下是使用isin()函数的另一种方法:

list_of_words = ['Yes']
dfData["Yes-Count"] = dfData.isin(list_of_words).sum(axis='columns')

使用此方法,您可以将DataFrame元素与多个值进行比较。 isin()函数返回一个布尔值DataFrame,显示您的DataFrame元素是否与list_of_words中的任何字词匹配。