Распределите наблюдения по категориям, используя значения в 2 разных фреймах данных на основе нескольких условных операторов - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть два фрейма данных панд с двумя разными наборами значений. Я хочу классифицировать значения в каждом фрейме данных независимо, а затем использовать эти независимые категории, чтобы назначить окончательную категорию для каждого наблюдения. Положение ячейки в кадрах данных - это один и тот же образец (т. Е. Один и тот же образец с разными критериями измерения). Приведенный ниже код генерирует набор данных, аналогичный моему, и является моей попыткой использовать два фрейма данных для создания одной категории.

Код назначает правильные категории в отдельных фреймах данных. Тем не менее, когда я пытаюсь использовать два отдельных классифицированных фрейма данных, он просто выдает первое условное многократно, но в правильных измерениях (см. Ниже для визуального).

import pandas as pd
import numpy as np
data = np.array(([1,2,3,4,5,5,np.NaN,np.NaN],[2,2,3,2,np.NaN,np.NaN,np.NaN,np.NaN],[4,4,2,5,1,np.NaN,np.NaN,np.NaN]))
df1 = pd.DataFrame(data, columns = ['0','1','2','3','4','5','6','7'])
data2 = np.array(([1,2,1,0,0,0,np.NaN,np.NaN],[1,0,1,0,np.NaN,np.NaN,np.NaN,np.NaN],[4,4,0,5,1,np.NaN,np.NaN,np.NaN]))
df2 = pd.DataFrame(data2, columns = ['0','1','2','3','4','5','6',"7"])
df3 = pd.DataFrame()
df4 = pd.DataFrame()

cols = np.transpose(df1)
cols2 = pd.DataFrame(cols.index)
col3 = cols2.index.values

def catsr(x):
    if x <= 2:
        return "trib"
    if x > 2 and x <= 5:
        return "ohio"

def catba(x):
    if x <= 1:
        return "lusk"
    if x > 1:
        return "not lusk"

def catall(Srdf,Badf):
        d1 = Srdf
        d2 = Badf
        for y in range (len(col3)):
            if (d1 is "ohio" and d2 is "lusk" or "not lusk"):
                yield "ohio"
            if (d1 is "trib" and d2 is "lusk"):
                yield  "lusk"
            if (d1 is "trib" and d2 is "not lusk"):
                yield "trib"

def rep(cols):
        rows = df3.index.values
        for rows in range(len(df3.index.values)):
            j = list(catall(df3,df4))
            yield list(j)         

for col in df1.columns:
    df3[col] = df1[col].apply(catsr)

for col in df2.columns:
    df4[col] = df2[col].apply(catba)


final_category = pd.DataFrame(list(rep(cols)))

Вывод этого кода дает фрейм данных, который выглядит следующим образом:

      0       1      2       3       4       5        6      7
0   ohio    ohio    ohio    ohio    ohio    ohio    ohio    ohio
1   ohio    ohio    ohio    ohio    ohio    ohio    ohio    ohio
2   ohio    ohio    ohio    ohio    ohio    ohio    ohio    ohio

Если бы код работал правильно, он бы выглядел так:

     0       1       2       3      4        5       6       7
0   lusk    trib    ohio    ohio    ohio    ohio    none    none
1   lusk    lusk    ohio    lusk    none    none    none    none
2   ohio    ohio    lusk    ohio    lusk    none    none    none
...