2016-04-03 1 views
1

Есть ли встроенная функция для получения либо полного вычитания, либо деления целого ряда значений?Альтернатива сумме или продукту для вычитания или деления в рядах панд

Например:

s1 = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e']) 
s1 
a -0.238762 
b -0.669687 
c 0.618808 
d 1.056264 
e -1.472528 

result = 0.228405 

Я предполагаю, что я должен создать lambda функцию с subtract или div методов и применять к серии, но я не вижу, как применять эти методы на одной и той же серии.

+0

Это не ясно из вашего вопроса и 'result', что вы хотите. – Zero

+0

это просто вычитание. Первое значение минус следующий минус следующего и т. Д. Извините – gis20

+3

@ gis20: Я замечаю, что вы задали 21 вопрос, но не приняли никаких ответов. Пожалуйста, подумайте над тем, чтобы пересмотреть ваши старые вопросы и отметить ответы, которые помогли вам там [принято] (http://stackoverflow.com/help/accepted-answer). –

ответ

3

Я не думаю, что это очень прямой путь в панд, но в NumPy есть ufunc.reduce способ сделать это:

>>> s1 
a -0.238762 
b -0.669687 
c 0.618808 
d 1.056264 
e -1.472528 
Name: s1, dtype: float64 

>>> np.subtract.reduce(s1.values) 
0.22838100000000017 

(Примечание: это очень немного отличается от ожидаемого значения вследствие округление - серия печатает только шесть знаков после запятой.)

Для деления вы можете использовать np.divide.reduce(s1.values).


Если вы действительно должны были осуществить это в панд, вы могли бы написать:

s2 = -s1[::-1]    # multiply values by -1, reverse Series 
s2.iloc[-1] = -s2.iloc[-1] # set last value back to original sign 
s2.sum()     # sum 

Который снова дающий 0.2283810.... Это, вероятно, будет намного медленнее из-за создания и индексации новой серии s2.

1

Так вы можете использовать reduce с функцией лямбда.

>>> reduce(lambda a, b: a - b, s) 
0.22838100000000017 

И некоторые другие распространенные операции:

reduce(lambda a, b: a * b, s) 
-0.15389660387465764 

s.product() 
-0.15389660387465764 

reduce(lambda a, b: a/float(b), s) 
-0.3704259301942105 

reduce(lambda a, b: a + b, s) 
-0.70590500000000023 

s.sum() 
-0.7059050000000002 
Смежные вопросы