2017-09-14 38 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() –

相關問題