Как эффективно проверить непрерывный диапазон значений в каждой строке кадра данных панд? - PullRequest
2 голосов
/ 03 мая 2019

Предположим, у нас есть датафрейм панд, который выглядит следующим образом:

df = pd.DataFrame(
        {'A': [0, 0, 1, 0],
        'a': list('aaaa'),
        'B': [1, 0 , 0, 1],
        'b': list('bbbb'),
        'C': [1, 1, 0, 1],
        'c': list('cccc'),
        'D': [0, 1, 0, 1],
        'd': list('dddd')},
        index=[1, 2, 3, 4])

Вывод будет:

   A  a  B  b  C  c  D  d
1  0  a  1  b  1  c  0  d
2  0  a  0  b  1  c  1  d
3  1  a  0  b  0  c  0  d
4  0  a  1  b  1  c  1  d

Итак, теперь я хочу получить строки этого фрейма данных, который содержит по крайней мере, например, два нуля последовательно в столбцах A, B, C, D.
Для кадра данных выше строки с индексами 2 и 3 удовлетворяют этим условиям: столбцы A, B второй строки содержат нули, а столбцов B, C достаточно для третьей строки.

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

Итак, в конце концов я хочу получить логическую серию, которая должна выглядеть следующим образом:

1 false
2 true
3 true
4 false

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

Ответы [ 3 ]

3 голосов
/ 03 мая 2019

Выберите числовые столбцы, затем используйте shift для сравнения:

u = df.select_dtypes(np.number).T
((u == u.shift()) & (u == 0)).any()

1    False
2     True
3     True
4    False
dtype: bool
1 голос
/ 03 мая 2019

Данные настроены от cs95

u = df.select_dtypes(np.number).T

(u.rolling(2).sum()==0).any()
Out[404]: 
1    False
2     True
3     True
4    False
dtype: bool
0 голосов
/ 03 мая 2019

Вы можете использовать функцию pandas и определить свою собственную функцию, проверяя ваше состояние следующим образом:

# columns you want to check. Note they have to be in the right order!!
columns = ["A", "B", "C", "D"]

# Custom function you apply over df, takes a row as input
def zeros_condition(row):
    # loop over the columns.
    for n in range(len(columns)-1): 
        # return true if 0s in two adjacent columns, else false
        if row[columns[n]] == row[columns[n+1]] == 0:
            return True
    return False

result = df.apply(zeros_condition, axis=1)

результат:

1    False
2     True
3     True
4    False
dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...