У меня есть два фрейма данных панд с двумя разными наборами значений. Я хочу классифицировать значения в каждом фрейме данных независимо, а затем использовать эти независимые категории, чтобы назначить окончательную категорию для каждого наблюдения. Положение ячейки в кадрах данных - это один и тот же образец (т. Е. Один и тот же образец с разными критериями измерения). Приведенный ниже код генерирует набор данных, аналогичный моему, и является моей попыткой использовать два фрейма данных для создания одной категории.
Код назначает правильные категории в отдельных фреймах данных. Тем не менее, когда я пытаюсь использовать два отдельных классифицированных фрейма данных, он просто выдает первое условное многократно, но в правильных измерениях (см. Ниже для визуального).
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