2015-08-14 77 views
0

在我的數據框中,我有一個列的項目是包含字符串的列表。有三個可用的字符串,但每個列表可以包含零個或多個這些字符串。如何計算熊貓中單個列中的項目?

我的目標是創建三列與每個字符串的計數,無論是作爲絕對數字或百分比。

import pd 
import collections 

df[["C1", "C2", "C3"]] = df.apply(lambda x: pd.Series(x.D).value_counts(), axis=1) 

我用df[["C1", "C2", "C3"]] = df.apply(lambda x: pd.Series(collections.Counter(x.D)), axis=1),但我得到了以下錯誤:ValueError: Columns must be same length as key

+1

樣本數據和期望的輸出將使這更清晰。 – JohnE

回答

0

我希望我理解你想要正確地做什麼,

假設你有興趣的字符串數組strings並且包含字符串數組的數據框的列爲D,則此代碼應該做竅門

strings=['C1','C2','C3'] 
output_df=pd.DataFrame([]) 
for s in strings: 
    output_df[s]=input_df['D'].apply(lambda arr:len([item for item in arr if item==s])) 

如果你希望將新列追加到舊的數據幀,只要使用相同的DataFrame的輸入和輸出

0

這聽起來像你可以很容易地解決這個問題,你生成數據幀之前。如果您有三個列表,每個列表包含三個字符串的可變數字。那麼改爲:

import pandas as pd 

possible_strings = ('C1', 'C2', 'C3') 
list_1 = ['C1', 'C1', 'C2', 'C3'] 
list_2 = ['C2'] 
list_3 = ['C3', 'C3'] 

lists = [list_1, list_2, list_3] 
list_of_series = [] 
for x in range(len(lists)): 
    vals = [] 
    for s in possible_strings: 
     vals.append(lists[x].count(s)) 
    list_of_series.append(pd.Series(vals)) 

df = pd.concat(list_of_series, axis=1) 

這會創建您似乎需要的數據框。