2017-09-14 54 views
1

非常感谢您的帮助!使用多列中的相同字符串值对熊猫数据框中的总行数进行计数

问题:如何计算在多列中包含'9999-Don't Know'的行数?

我已经能够找到解决方案,让我半途而废。例如,我发现了许多示例,您可以使用该列的名称来获取具有特定条件的行数。但是,我有76列,每一列代表一个调查中的不同问题,因此有不同的标签,所以这将是非常低效的。

下面是一个示例df。再次,请记住我有76列,所以使用列的名称不是一个可行的选择。

pd.DataFrame.from_items([('RespondentId', ['1ghi3g','335hduu','4vlsiu4','5nnvkkt','634deds','7kjng']), ('Satisfaction - Timing', ['9-Excellent','9-Excellent','9999-Don\'t Know','8-Very Good','1-Very Unsatisfied','9999-Don\'t Know']),('Response Speed - Time',['9999-Don\'t Know','9999-Don\'t Know','9-Excellent','9-Excellent','9-Excellent','9-Excellent'])]) 

正如你所看到的,总共有4行,其中“9999 - 别专有”出现,所以我想获得输出4

回答

2

这会给你的行数等于每列

df.astype(object).eq("9999-Don't Know").sum() 

为“9999 - 别专有”这会给你总的“9999 - 别专有”计数,感谢@米奇

df.astype(object).eq("9999-Don't Know").values.sum() 

这会给你总行数与至少一个

df.astype(object).eq("9999-Don't Know").any(1).sum() 
+0

可能想'.values.sum()'? – miradulo

+0

或df.eq(“9999-Don't Know”)。sum()。sum() - double sum –

+0

我尝试了你的解决方案,但收到TypeError:Could not compare [“9999-Don't Know”]块值。这是否意味着这个Excel文件中某些单元格的格式可能不一致? @Mitch。我的解决方案也收到了同样的信息。 – techscolasticus

1

您也可以使用此:

df.stack().str.contains("9999-Don't Know").sum() 

尽管这比@piRSquared解决方案慢:

In [38]: timeit df.astype(str).eq("9999-Don't Know").values.sum() 
1000 loops, best of 3: 182 us per loop 

In [39]: timeit df.stack().str.contains("9999-Don't Know").sum() 
1000 loops, best of 3: 467 us per loop 
+0

感谢一堆!这正是我所期待的。 – techscolasticus

+0

@techscolasticus欢迎您。但我建议您接受另一种解决方案,因为它更快.. – MedAli

+0

我会,但它给了我一个错误,所以我无法获得总的行数。 – techscolasticus

1

另一个解决方案是:

df.eq("9999-Don't Know").sum().sum() 

还你提到的错误类型:

TypeError: Could not compare ["9999-Don't Know"] with block values. 

这意味着你有一个像数据帧的元素列表。它可以转换为字符串与代码:

df = df.applymap(lambda x: x[0] if type(x) == list else x) 
+0

所以df = df.applymap ...做了工作,但我不知道我应该做什么之后,以获得总行数 – techscolasticus

+0

之后,您可以使用任何建议在这里的解决方案。例如。 df.eq(“9999-Don't Know”)。sum()。sum() –

相关问题