2014-09-02 82 views
6

我試圖做下面的命令在python相當於:的R蟒蛇大熊貓dcast相當於

test <- data.frame(convert_me=c('Convert1','Convert2','Convert3'), 
        values=rnorm(3,45, 12), age_col=c('23','33','44')) 
test 

library(reshape2) 
t <- dcast(test, values ~ convert_me+age_col, length ) 
t 

也就是說,這樣的:

convert_me values  age_col 
Convert1  21.71502  23 
Convert2  58.35506  33 
Convert3  60.41639  44 

變成這樣:

values  Convert2_33 Convert1_23 Convert3_44 
21.71502   0   1   0 
58.35506   1   0   0 
60.41639   0   0   1 

我知道,用虛擬變量我可以得到列的值並轉換爲列的名稱,但有沒有辦法像R一樣容易地合併它們(組合)?

+0

什麼是更高層次的原因,你想要做這個特定的轉型? – 2014-09-02 08:09:36

+0

我正在創建列,以便我可以在機器學習算法中使用它。 – 2014-09-02 08:14:33

+1

你知道R給你的是'1 + length(convert_me)* length(age_col)'的列數嗎?起初我以爲你會想要每一個獨特的年齡段的一列,但這不是R爲你做的(你可以看看你是否將相同的年齡分配到兩行)。 – 2014-09-02 08:37:26

回答

6

可以使用crosstab功能如下:

In [14]: pd.crosstab(index=df['values'], columns=[df['convert_me'], df['age_col']]) 
Out[14]: 
convert_me Convert1 Convert2 Convert3 
age_col   23  33  44 
values         
21.71502   1   0   0 
58.35506   0   1   0 
60.41639   0   0   1 

pivot_table(與len作爲凝聚功能,但在這裏你手動得fillna的NaN的以零):

In [18]: df.pivot_table(index=['values'], columns=['age_col', 'convert_me'], aggfunc=len).fillna(0) 
Out[18]: 
age_col   23  33  44 
convert_me Convert1 Convert2 Convert3 
values         
21.71502   1   0   0 
58.35506   0   1   0 
60.41639   0   0   1 

這裏查看這個文檔:http://pandas.pydata.org/pandas-docs/stable/reshaping.html#pivot-tables-and-cross-tabulations

大多數功能我熊貓將返回一個多級(層次)索引,在這種情況下,爲列。如果你想「融化」此爲一個水平像R中,你可以做:

In [15]: df_cross = pd.crosstab(index=df['values'], columns=[df['convert_me'], df['age_col']]) 

In [16]: df_cross.columns = ["{0}_{1}".format(l1, l2) for l1, l2 in df_cross.columns] 

In [17]: df_cross 
Out[17]: 
      Convert1_23 Convert2_33 Convert3_44 
values           
21.71502   1   0   0 
58.35506   0   1   0 
60.41639   0   0   1 
+0

這差不多。有沒有辦法合併convert_me和age_col?如何創建沒有關卡的單個表格。 – 2014-09-02 08:36:25

+0

它已經在我的答案:-)(見最低部分) – joris 2014-09-02 08:37:43

+0

是的。沒有看到。謝謝!!! – 2014-09-02 08:58:42

0

我們可以使用pd.get_dummies功能。在當前的0.22.0熊貓中,當對Dataframe進行單熱編碼時,通常使用pd.get_dummies

import pandas as pd 

df_dummies = pd.get_dummies(
    df[['convert_me', 'age_col']].apply(lambda x: '_'.join(x.astype(str)), axis=1), 
    prefix_sep='') 
df = pd.concat([df["values"], df_dummies], axis=1) 
# Out[39]: 
#  values Convert1_23 Convert2_33 Convert3_44 
# 0 21.71502   1   0   0 
# 1 58.35506   0   1   0 
# 2 60.41639   0   0   1