2015-04-10 2 views
2

У меня есть dataframe (панель [xyz]), содержащая только 1, 0 и -1. Размеры: строки 0:10 и столбцы a: j.python pandas условное число в столбцах

Я хотел бы создать другую dataframe (DF), который имеет ту же вертикальную ось, но только 3 колонки: col_1 = рассчитывать все ненулевые значения (1S и -1S) col_2 = сосчитать все 1s col_3 = подсчитывать все -1S

Я нашел это в поиске SO:

df[col_1] = (pan[xyz]['a','b','c','d','e'] > 0).count(axis=1)

... и попробовал много различных ITE rations, но я не могу получить условное (> 0), чтобы различать разные значения в pan [xyz]. Счет всегда равен 5.

Любая помощь будет очень признательна.

Edit:

сковорода [хуг] =

. \t 'a' \t 'b' \t 'c' \t 'd' \t 'e' \t 'f' \t 'g' \t 'h' \t 'i' \t 'j' 
 
0 \t 1 \t 0 \t 0 \t -1 \t 0 \t 0 \t -1 \t 0 \t 1 \t 0 
 
1 \t 0 \t 1 \t 0 \t 0 \t 0 \t 1 \t 0 \t 0 \t 0 \t -1 
 
2 \t 1 \t 0 \t 0 \t 0 \t 0 \t -1 \t 0 \t 0 \t 0 \t 0 
 
3 \t 0 \t -1 \t 0 \t 0 \t 0 \t 0 \t 0 \t 1 \t 0 \t 0 
 
4 \t 0 \t 0 \t 0 \t 1 \t 0 \t 0 \t -1 \t 0 \t 0 \t -1

ДФ должен быть =

. \t col_1 \t col_2 \t col_3 
 
0 \t 4 \t 2 \t 2 
 
1 \t 3 \t 2 \t 1 
 
2 \t 2 \t 1 \t 1 
 
3 \t 2 \t 1 \t 1 
 
4 \t 3 \t 1 \t 2

Но это то, что я получаю за col_1:

df = (panel[xyz] > 0).count(axis=1) 
 

 
df 
 
Out[129]: 
 
0 10 
 
1 10 
 
2 10 
 
3 10 
 
4 10 
 
dtype: int6

+0

Thanks JohnE, good advice. – MJS

ответ

3

Я просто делаю это с плоской dataframe, но это то же самое для панели. Вы можете сделать один из двух способов. Первый способ заключается в то, что ты сделал, просто изменить count() к sum():

(df > 0).sum(axis=1) 

Основная структура логическая и истина и ложь как посчитано, в то время как если вы просуммировать их это интерпретируется более, как вы ожидали (0/1).

Но более стандартный способ сделать это будет выглядеть так:

df[ df > 0 ].count(axis=1) 

Хотя первый метод был основан на dataframe из булевы, последний выглядит следующим образом:

df[ df > 0 ] 

    a b c d e f g h i j 
0 1 NaN NaN NaN NaN NaN NaN NaN 1 NaN 
1 NaN 1 NaN NaN NaN 1 NaN NaN NaN NaN 
2 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN 
3 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN 
4 NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN 

В в этом случае на самом деле не имеет значения, какой метод вы используете, но в целом последнее будет лучше, потому что вы можете сделать больше с ним. Например, с помощью прежнего метода (который имеет бинарные результаты по дизайну) все, что вы действительно можете сделать, это счет, но в последнем методе вы можете рассчитывать, суммировать, умножать и т. Д.

Потенциальная полезность этого может быть более очевидным для случая df != 0, где имеется более двух возможных значений:

df[ df != 0 ] 

    a b c d e f g h i j 
0 1 NaN NaN -1 NaN NaN -1 NaN 1 NaN 
1 NaN 1 NaN NaN NaN 1 NaN NaN NaN -1 
2 1 NaN NaN NaN NaN -1 NaN NaN NaN NaN 
3 NaN -1 NaN NaN NaN NaN NaN 1 NaN NaN 
4 NaN NaN NaN 1 NaN NaN -1 NaN NaN -1 
+0

Спасибо, Джон, это именно то, что мне нужно было понять. Отличное объяснение. – MJS

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