2016-09-27 25 views
2

我有以下的數據幀:蟒大熊貓總結名義變量(計數)

KEY PROD PARAMETER Y/N 
1 AAA PARAM1 Y 
1 AAA PARAM2 N 
1 AAA PARAM3 N 
2 AAA PARAM1 N 
2 AAA PARAM2 Y 
2 AAA PARAM3 Y 
3 CCC PARAM1 Y 
3 CCC PARAM2 Y 
3 CCC PARAM3 Y 

我對由PROD和參數列總結Y/N列值,並得到以下輸出:

PROD PARAM Y N 
AAA PARAM1 1 1 
AAA PARAM2 1 1 
AAA PARAM3 1 1 
CCC PARAM1 1 0 
CCC PARAM2 1 0 
CCC PARAM3 1 0 

雖然Y和N值是來自原始數據幀的Y/N列值的計數。

+0

嗨菲利克斯,你嘗試過這麼遠嗎? – ASGM

+0

試過pd.melt和pd.pivot_table。沒有成功 – Felix

+0

嘿菲利克斯,你能給我們一個代碼行的df樣本,所以我們可以玩嗎? –

回答

3

你可以使用pivot_table用值1創建一個額外的列不要緊要麼方式(你只對其計數)

df['Y/Ncount'] = 1 

df = df.pivot_table(index=['PROD', 'PARAMETER'], columns=['Y/N'], values=['Y/Ncount'], 
        aggfunc=sum, fill_value=0) 

df.columns = [col for col in df.columns.get_level_values(1)] 
df.reset_index() 

Image


最簡單的操作在這種情況下使用將是crosstab這將產生在Y/N列內存在的值的頻率計數:

pd.crosstab([df['PROD'], df['PARAMETER']], df['Y/N']) 

Image

+0

啊,我忘了'crosstab' !好的解決方案 –

+0

連我。剛想起它。之前正在考慮'groupby' /'pivot'的行。 –

3

你想要得到的值的計數的Y/N列,由PRODPARAMETER分組。

import io 
import pandas as pd 

data = io.StringIO('''\ 
KEY PROD PARAMETER Y/N 
1 AAA PARAM1 Y 
1 AAA PARAM2 N 
1 AAA PARAM3 N 
2 AAA PARAM1 N 
2 AAA PARAM2 Y 
2 AAA PARAM3 Y 
3 CCC PARAM1 Y 
3 CCC PARAM2 Y 
3 CCC PARAM3 Y 
''') 
df = pd.read_csv(data, delim_whitespace=True) 

res = (df.groupby(['PROD', 'PARAMETER'])['Y/N'] # Group by `PROD` and `PARAMETER` 
               # and select the `Y/N` column 
     .value_counts()      # Get the count of values 
     .unstack('Y/N')      # Long-to-wide format change 
     .fillna(0)        # Fill `NaN`s with zero 
     .astype(int))       # Cast to integer 
print(res) 

輸出:

Y/N    N Y 
PROD PARAMETER  
AAA PARAM1  1 1 
    PARAM2  1 1 
    PARAM3  1 1 
CCC PARAM1  0 1 
    PARAM2  0 1 
    PARAM3  0 1