2014-09-02 26 views
6

Tôi cố gắng để làm tương đương với các lệnh dưới đây trong python:R dcast tương đương trong gấu trúc python

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 

Đó là, này:

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

trở này:

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

Tôi biết rằng với các biến giả tôi có thể nhận được giá trị của các cột và chuyển đổi thành tên của cột, nhưng có cách nào không để kết hợp chúng (kết hợp) dễ dàng, như R không?

+0

Lý do cấp cao hơn bạn muốn thực hiện chuyển đổi cụ thể này là gì? –

+0

Tôi đang tạo các cột để tôi có thể sử dụng nó trong thuật toán học máy. –

+1

Bạn có nhận ra rằng những gì R cho bạn có một số cột có độ dài '1 + (convert_me) * (age_col)'? Lúc đầu, tôi nghĩ bạn sẽ muốn một cột cho mỗi độ tuổi độc đáo, nhưng đó không phải là những gì R đang làm cho bạn (bạn có thể thấy nếu bạn chỉ định cùng một độ tuổi cho hai hàng). –

Trả lời

6

Bạn có thể sử dụng crosstab chức năng cho việc này:

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 

hoặc pivot_table (với len như chức năng tập hợp, nhưng ở đây bạn phải fillna các Nans với số không bằng tay):

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 

Xem tại đây tài liệu về điều này: http://pandas.pydata.org/pandas-docs/stable/reshaping.html#pivot-tables-and-cross-tabulations

Hầu hết các chức năng tôi n gấu trúc sẽ trả về chỉ mục đa cấp (phân cấp), trong trường hợp này cho các cột. Nếu bạn muốn 'làm tan' cái này thành một cấp độ như trong R bạn có thể làm:

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

thats gần như vậy. Có cách nào để hợp nhất convert_me và age_col? Làm thế nào tôi có thể tạo một bảng duy nhất, không có các cấp. –

+0

Đã có câu trả lời của tôi :-) (xem phần thấp nhất) – joris

+0

Đúng. Không thấy điều đó. Cảm ơn!!! –

0

Chúng tôi có thể sử dụng chức năng pd.get_dummies. Trong gấu trúc hiện tại 0.22.0, thông thường sử dụng pd.get_dummies khi mã hóa một lần thành Dataframe.

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 
Các vấn đề liên quan