2014-09-24 2 views
0

У меня есть дата-схема, в которой есть несколько столбцов, содержащих числовые данные. И положительные, и отрицательные числа найдены в каждом столбце, но я хочу разделить их на свой собственный набор столбцов. В настоящее время dataframe выглядит следующим образом:Pandas - Разделение столбцов на отдельные положительные и отрицательные числа

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> = 0] .join (DF [DF <0], lsuffix = "А", rsuffix = "В")'. – DSM

+0

@ DSM да, что на самом деле аккуратно, обновит – EdChum

Смежные вопросы