2013-06-23 66 views
4

我很難重新組織此數據框。我想我應該使用pd.pivot_tablepd.crosstab,但我不確定如何完成這項工作。將DataFrame分類值重構爲行

這裏是我的數據框:

vicro = pd.read_csv(vicroURL) 
vicro_subset = vicro.ix[:,['P1', 'P10', 'P30', 'P71', 'P82', 'P90']] 

In [6]: vicro 
vicro   vicroURL  vicro_subset 

In [6]: vicro_subset.head() 
Out[6]: 
    P1 P10 P30 P71 P82 P90 
0 - I - - - M 
1 - I - V T M 
2 - I - V A M 
3 - I - T - M 
4 - - - - A - 

我有什麼做的是採取一切可能的值在這個數據幀,讓他們成行。新值將是計數。東西看起來像:

Out[6]: 
    P1 P10 P30 P71 P82 P90 
I 0 4 0 0 0 0 
V 0 0 0 2 0 0 
A 0 0 0 0 2 0 
M 0 0 0 0 0 4 
T 0 0 0 1 1 0 

任何幫助將不勝感激!謝謝。

編輯: 的答案闡述使用熔融,都幫助我瞭解大熊貓多一點,但有更多的未知,我在「融化」的答案:

In [8]: melted_df = pd.melt(vicro_subset) 

In [9]: melted_df.head() 
Out[9]: 
    variable value 
0  P1  - 
1  P1  - 
2  P1  - 
3  P1  - 
4  P1  - 


In [13]: grouped_melt = melted_df.groupby(['variable','value'])['value'].count() 
In [14]: grouped_melt.head() 
Out[14]: 
variable value 
P1  -  797 
      .  269 
P10  -  339 
      .   1 
      F  132 


In [15]: unstacked_group = grouped_melt.unstack() 

In [16]: unstacked_group.head() 
Out[16]: 
<class 'pandas.core.frame.DataFrame'> 
Index: 5 entries, P1 to P82 
Data columns: 
-  5 non-null values 
.  2 non-null values 
A  1 non-null values 
AITV 1 non-null values 
AT  2 non-null values 

In [17]: transpose_unstack = unstacked_group.T 

In [18]: transpose_unstack.head() 
Out[18]: 
variable P1 P10 P30 P71 P82 P90 
value         
-   797 339 1005 452 604 634 
.   269 1 NaN NaN NaN NaN 
A   NaN NaN NaN NaN 282 NaN 
AITV  NaN NaN NaN NaN 1 NaN 
AT  NaN NaN NaN 1 2 NaN 

回答

5

或者,這樣的事情應該工作:

In [1]: import numpy as np 

In [2]: import pandas as pd 

In [3]: df = pd.DataFrame(np.random.randint(0,5,12).reshape(3,4), 
              columns=list('abcd')) 

In [4]: print df 
    a b c d 
0 2 2 3 1 
1 0 1 0 2 
2 1 3 0 4 

In [5]: new = pd.concat([df[col].value_counts() for col in df.columns], axis=1) 

In [6]: new.columns = df.columns 

In [7]: print new 
    a b c d 
0 1 NaN 2 NaN 
1 1 1 NaN 1 
2 1 1 NaN 1 
3 NaN 1 1 NaN 
4 NaN NaN NaN 1 
+0

很好的見解......新df的列實際上是原始df的value_counts。 – herrfz

+0

很好的見解... +1 –

+0

這很乾淨,謝謝。 – gus

2

我想關鍵是要使用melt ,之後還有一些雜技。因此,這裏是你的數據框:

In [21]: df 
Out[21]: 
    P1 P10 P30 P71 P82 P90 
0 - I - - - M 
1 - I - V T M 
2 - I - V A M 
3 - I - T - M 
4 - - - - A - 

現在,如果你做了以下(你可能想通過IPython的步驟就看到中間結果):

In [22]: pd.melt(df).groupby(['variable', 'value'])['value'].count().unstack().T 
.fillna(0) 
Out[22]: 
variable P1 P10 P30 P71 P82 P90 
value 
-   5 1 5 2 2 1 
A   0 0 0 0 2 0 
I   0 4 0 0 0 0 
M   0 0 0 0 0 4 
T   0 0 0 1 1 0 
V   0 0 0 2 0 0 

說你保存結果df2,那麼你可以去掉 ' - ' 行:

In [25]: df2.drop('-') 
Out[25]: 
variable P1 P10 P30 P71 P82 P90 
value 
A   0 0 0 0 2 0 
I   0 4 0 0 0 0 
M   0 0 0 0 0 4 
T   0 0 0 1 1 0 
V   0 0 0 2 0 0 
+0

謝謝!那看起來不錯。 – gus

+0

優秀。你會介意接受答案嗎?或根的一個上面,或兩者,如果你喜歡... – herrfz

+0

我通過大熔化方法,並將其添加到上述問題。謝謝您的幫助。 – gus

相關問題