Итерируйте или перебирайте DataFrame с помощью функции и счетчика - PullRequest
0 голосов
/ 25 октября 2019

как я могу перебрать строки и проверить, является ли значение двойного размера (или больше) или половины размера (или меньше), чем его сосед, и посчитать это число для каждой строки и хранить в переменной count? Например, вот мой датафрейм. Во втором ряду вы можете сказать 4 - это половина (или меньше) или двойка или больше, чем 6? Ответ: НЕТ, поэтому count = 0.

А затем вы проверяете, 6 - это половина (или меньше) или двойка или больше 1? Ответ: ДА, значит count = 1.

A B C
1 0 1
4 6 1
3 3 3
5 0 0

Вот код

import math
import pandas as pd
data = {'A':[1,4,3,5],'B':[0,6,3,0],'C':[1,1,3,0]} #sample data
df = pd.DataFrame(data) 

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Вам не нужно повторять, это будет очень медленно. Вот векторизованное решение, сравнивая векторы с shift, mul и div

df2 = df.shift(axis=1) # shift the values one place to compare
m1 = df >= df2.mul(2) # values which are double or more
m2 = df <= df2.div(2) # values which are half or less

counts = (m1|m2).sum(axis=1)

Выход

0    2
1    1
2    0
3    2
dtype: int64

Шаг за шагом :

Сдвиг значений на одно место вправо для сравнения:

df.shift(axis=1)

    A    B    C
0 NaN  1.0  0.0
1 NaN  4.0  6.0
2 NaN  3.0  3.0
3 NaN  5.0  0.0

Сравнение того, какое значение в два или более раз превышает его сосед:

df >= df2.mul(2)

       A      B      C
0  False  False   True
1  False  False  False
2  False  False  False
3  False  False   True

Сравнение того, какое значение наполовину или меньше его соседа:

df <= df2.div(2)

       A      B      C
0  False   True  False
1  False  False   True
2  False  False  False
3  False   True   True

Окончательно получим счет, где сравнение один или два - True:

уведомлениечто | является оператором or в pandas

m1|m2

       A      B      C
0  False   True   True
1  False  False   True
2  False  False  False
3  False   True   True
1 голос
/ 25 октября 2019

Ответ Эрфана верен и намного лучше, чем итерация, потому что векторизация операции позволяет вам использовать возможности эффективного скомпилированного кода в pandas и numpy для гораздо более быстрого вычисления таких вещей с меньшим потреблением памяти.

Однако при необходимости можно выполнить итерацию, используя iterrows() и iteritems(), и индексы можно использовать для сравнения с соседними значениями.

import math
import pandas as pd
data = {'A':[1,4,3,5],'B':[0,6,3,0],'C':[1,1,3,0]} #sample data
df = pd.DataFrame(data) 

for rindex, row in df.iterrows():
    for cindex, value, in row.iteritems():
        print("row", rindex, "column ", cindex, "value ", value)

Я не буду приниматьвремя напечатать полный ответ, потому что векторизованное решение лучше во всех отношениях для этого приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...