Выбор строк данных на основе нескольких столбцов, где должны быть созданы новые функции для обработки условий в некоторых столбцах - PullRequest
3 голосов
/ 30 марта 2020

У меня есть фрейм данных, который состоит из нескольких столбцов. Я хочу выбрать строки на основе условий в нескольких столбцах. Предполагая, что у меня есть четыре столбца в кадре данных:

import pandas as pd
di={"A":[1,2,3,4,5],
    "B":['Tokyo','Madrid','Professor','helsinki','Tokyo Oliveira'],
"C":['250','200//250','250//250//200','12','200//300'],
"D":['Left','Right','Left','Right','Right']}
data=pd.DataFrame(di)

Я хочу выбрать Токио в столбце B, 200 в столбце C, слева в столбце D. При этом будет выбрана только первая строка , Я должен создать функцию для обработки столбца C. Поскольку мне нужно проверить первое значение, если строка содержит список с //

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

def check_200(thecolumn):
thelist=[]
for i in thecolumn:
    f=i
    if "//" in f:
        #split based on //
        z=f.split("//")
        f=z[0]

    f=float(f)
    if f > 200.00:
        thelist.append(True)
    else:
        thelist.append(False)
return thelist

Затем я создать несколько условий:

selecteddata=data[(data.B.str.contains("Tokyo")) & 
(data.D.str.contains("Left"))&(check_200(data.C))]

Это лучший способ сделать это, или есть более простая функция pandas, которая может удовлетворить такие требования?

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Я не думаю, что есть самый питон c способ сделать это, но я думаю, что это то, что вы хотите:

bool_idx = ((data.B.str.contains("Tokyo")) & 
(data.D.str.contains("Left")) & (data.C.str.contains("//")
& (data.C.str.split("//")[0].astype(float)>200.00))

selecteddata=data[bool_idx]
0 голосов
/ 30 марта 2020

Ответ Бруно делает свою работу, и я согласен, что логическое маскирование - это путь к go. Этот ответ удерживает код немного ближе к запрошенному формату.


import numpy as np

def col_condition(col):
    col = col.apply(lambda x: float(x.split('//')[0]) > 200)
    return col

data = data[(data.B.str.contains('Tokyo')) & (data.D.str.contains("Left")) &
             col_condition(data.C)]

Функция читает серии и преобразует каждый элемент в True или False, в зависимости от условия. Затем он возвращает эту маску.

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