2014-09-24 80 views
0

我有一個數據框,其中有許多列包含數字數據。正數和負數都可以在每一列中找到,但我想將它們分成它們自己的一組列。 目前,該數據幀是這樣的:熊貓 - 拆分列以分隔正數和負數

0 Col1 Col2 Col3 
1 55  43  98 
2 -20  35  88 
3 -43  -47  -77 

我想修改,所以它看起來是這樣的:

0 Col_1A Col_2A Col_3A  Col_1B Col_2B Col_3B 
1 55  43  98   NaN  NaN  NaN  
2 NaN  35  88   -20  NaN  NaN 
3 NaN  NaN  NaN   -43  -47  -77 

我想我可以使用lapply治療找出一個腳本解決方案的每一列的值作爲一個數組,將負值複製到一個新的列中,並從原始列表中刪除它們(如果我需要這樣做,我會將其作爲答案發布)但這會使我產生一個問題,命令解決方案有人知道怎麼做嗎?

回答

1

我們可以使用布爾掩蔽選擇感興趣的值,然後concat它們傳遞axis=1,然後你可以僅僅通過直接分配給columns屬性重命名:

In [145]: 

merged = pd.concat([df[df>=0], df[df<0]], axis=1) 
merged.columns = ['Col_1A','Col_2A','Col_3A','Col_1B','Col_2B','Col_3B'] 
merged 
Out[145]: 
    Col_1A Col_2A Col_3A Col_1B Col_2B Col_3B 
0             
1  55  43  98  NaN  NaN  NaN 
2  NaN  35  88  -20  NaN  NaN 
3  NaN  NaN  NaN  -43  -47  -77 

你可以join並設置所需的後綴(感謝@DSM):

In [147]: 

df[df>=0].join(df[df<0], lsuffix="_A", rsuffix="_B") 
Out[147]: 
    Col1_A Col2_A Col3_A Col1_B Col2_B Col3_B 
0             
1  55  43  98  NaN  NaN  NaN 
2  NaN  35  88  -20  NaN  NaN 
3  NaN  NaN  NaN  -43  -47  -77 

另一種方法是merge(這是什麼join下使用):

In [148]: 

df[df>=0].merge(df[df<0], left_index=True, right_index=True, suffixes=('_A', '_B')) 
Out[148]: 
    Col1_A Col2_A Col3_A Col1_B Col2_B Col3_B 
0             
1  55  43  98  NaN  NaN  NaN 
2  NaN  35  88  -20  NaN  NaN 
3  NaN  NaN  NaN  -43  -47  -77 
+1

或'join'而不是'concat':'df [df> = 0] .join(df [df <0],lsuffix =「A」,rsuffix =「B」)''。 – DSM 2014-09-24 14:45:51

+0

@DSM是的,實際上更整潔,會更新 – EdChum 2014-09-24 14:47:15