2016-09-21 46 views
2

我對Python很新穎。從2欄製作一張表

我有一個數據幀2列,列是這樣的:

db = pd.read_excel(path_to_file/file.xlsx) 
db = db.loc[:,['col1','col2']] 

col1 col2 
C  4 
C  5 
A  1 
B  6 
B  1 
A  2 
C  4 

我需要他們是這樣的:

1 2 3 4 5 6 
A 1 1 0 0 0 0 
B 1 0 0 0 0 1 
C 0 0 0 2 1 0 

,使他們像行和列值是指巧合的次數。

+0

的數據?我從文件中讀取 –

+2

當然,但是如何?提供代碼,我們可能會進一步提供幫助。 – Jan

回答

2

說你的列被稱爲catval

In [26]: df = pd.DataFrame({'cat': ['C', 'C', 'A', 'B', 'B', 'A', 'C'], 'val': [4, 5, 1, 6, 1, 2, 4]}) 

In [27]: df 
Out[27]: 
    cat val 
0 C 4 
1 C 5 
2 A 1 
3 B 6 
4 B 1 
5 A 2 
6 C 4 

然後你可以hierarchicaly groupby表,然後拆散它:

In [28]: df.val.groupby([df.cat, df.val]).sum().unstack().fillna(0).astype(int) 
Out[28]: 
val 1 2 4 5 6 
cat    
A 1 2 0 0 0 
B 1 0 0 0 6 
C 0 0 8 5 0 

編輯

由於IANS指出,3在這裏失蹤(謝謝!)。如果您需要有一系列色譜柱,那麼您可以使用

r = df.val.groupby([df.cat, df.val]).sum().unstack().fillna(0).astype(int) 

for c in set(range(1, 7)) - set(df.val.unique()): 
    r[c] = 0 
+0

列'3'丟失... – IanS

+0

@IanS你說得對 - 謝謝! (添加) –

1

我想你需要通過size aggreagate和reindex遺漏值添加到列:

print (df) 
    a b 
0 C 4 
1 C 5 
2 A 1 
3 B 6 
4 B 1 
5 A 2 
6 C 4 

df1 = df.b.groupby([df.a, df.b]) 
      .size() 
      .unstack() 
      .reindex(columns=(range(1,df.b.max() + 1))) 
      .fillna(0) 
      .astype(int) 

df1.index.name = None 
df1.columns.name = None 
print (df1) 
    1 2 3 4 5 6 
A 1 1 0 0 0 0 
B 1 0 0 0 0 1 
C 0 0 0 2 1 0 

相反size可以使用countsize計數NaN值,count沒有。

+0

列'3'缺少... – IanS

+0

是的,謝謝。我添加它。 – jezrael

+0

如果需要輸出,請使用'size'函數。 – jezrael

相關問題