2015-04-23 5 views
8

У меня есть панд DataFrame, что-то вроде:Слияние и вычитание столбцов DataFrame в пандах?

col1 col2 col3 col5 
NaN 1 2 8 
2  NaN 4 8 
4  NaN 4 8 

Я хочу сделать две вещи:

1) Merge столбцы 1 и 2:

newcol1 col3 col5 
1  2 8 
2  4 8 
4  4 8 

Я попытался с помощью .concat , но это просто конкатенирует строки. Не похоже, что я могу использовать стандартные операторы + с значениями NaN.

2) Вычесть столбец 5 из нового столбца 1 и столбца 3, так что я в конечном итоге с:

newcol1 col3 
-7   -6 
-6   -4 
-4   -4 

пытался делать это так:

dataframe[['newcol1', 'col2']] - dataframe['col5'] 

и

dataframe[['newcol1', 'col2']].subtract(dataframe['col5']) 

но не работает.

ответ

1
In [58]: 

df['newcol'] = df[['col1','col2']].sum(axis=1) - df['col5'] 
df['col3'] = df['col3'] - df['col5'] 
df 
Out[58]: 
    col1 col2 col3 col5 newcol 
0 NaN  1 -6  8  -7 
1  2 NaN -4  8  -6 
2  4 NaN -4  8  -4 

Вы можете уронить col1 и col2:

In [59]: 

df = df.drop(['col1','col2'],axis=1) 
df 
Out[59]: 
    col3 col5 newcol 
0 -6  8  -7 
1 -4  8  -6 
2 -4  8  -4 
+0

Это становится вычитание правильно, но мой 'newcol1' является колонна NaNs – user1566200

+2

Вы должны будете опубликуйте полные данные, чтобы все могли воспроизвести это. – EdChum

10

Чтобы получить новый столбец, вы можете использовать fillna (или combine_first):

df['newcol1'] = df.col1.fillna(df.col2) 

Тогда для вычитания, использования sub и укажите axis=0, так как мы хотим рассматривать индексы строк при сопоставлении меток (а не индексы столбцов, как и по умолчанию):

>>> df[['newcol1', 'col3']].sub(df['col5'], axis=0) 
    newcol1 col3 
0  -7 -6 
1  -6 -4 
2  -4 -4 
+0

Я должен что-то делать неправильно - когда я использую fillna, он просто заменяет все строки col2 на col1. – user1566200

+0

@ user1566200 - это озадачивает, он должен вернуть правильный результат. Какую версию Панд вы используете? Работает ли 'df.col1.combine_first (df.col2)' лучше? –

+0

Кроме того, при использовании .sub я получаю ошибку: «операнды не могут быть переданы вместе с фигурами (320,) (80,)» – user1566200

4

Вот один из подходов.

Вы можете создать newcol1 по sum(axis=1)

In [256]: df['newcol1'] = df[['col1', 'col2']].sum(axis=1) 

In [257]: df 
Out[257]: 
    col1 col2 col3 col5 newcol1 
0 NaN  1  2  8  1 
1  2 NaN  4  8  2 
2  4 NaN  4  8  4 

Затем используйте df.sub() на axis=0

In [258]: df[['newcol1', 'col3']].sub(df['col5'], axis=0) 
Out[258]: 
    newcol1 col3 
0  -7 -6 
1  -6 -4 
2  -4 -4 
+0

Так странно. Когда я делаю первую строку выше, я получаю newcol1 как столбец всех 0. – user1566200

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