Как сравнить набор данных с подмножеством себя? [Панды] - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь автоматизировать и создать более чистый код. Я хочу, чтобы мой код получил CSV, сгруппируйте его по X (в настоящее время переменная с именем "Class") а затем удалить каждые 3-е число от среднего.

import pandas as pd
import numpy as np


my_path = "data_291018.csv"
data_loc = pd.read_csv(my_path)

df = pd.DataFrame(data_loc)
df = df.drop(df.columns[df.columns.str.contains('unnamed', case=False)], axis=1)

class_8 = df[df["Class"] == 8]
class_11 = df[df["Class"] == 11]

heads = df.columns[4:].values

for i in heads:
    class_8[i] = class_8[i].apply(lambda x: x if abs(x-class_8[i].mean()) < 3*class_8[i].std() else np.nan)
    class_11[i] = class_11[i].apply(lambda x: x if abs(x-class_11[i].mean()) < 3*class_11[i].std() else np.nan)

both = pd.concat([class_8, class_11])

both.to_csv("data.csv", sep=',')

Я попытался вместо запуска на двух разных DF добавить

new_df = df.copy()
class_df = df.groupby("Class")

и работает

for i in heads:
    new_df[i] = new_df[i].apply(lambda x: x if abs(x-class_df[i].mean()) < 3*class_df[i].std() else np.nan)

и это не удалось ... "повысить ValueError (" Можно сравнивать только идентично помеченные " ValueError: ('Может сравнивать только идентично помеченные объекты Series', u'присутствует по индексу SubjNum ') "

Можете ли вы помочь мне? На более поздних этапах я хочу сгруппировать по более чем одной переменной.

Большое спасибо!

DF выглядит примерно так:

SubjNum Class   Genderm1f2  LRLevel exp1    exp2    exp3    exp4    exp5

8001    8   1   1   88  2   15  19  92

8002    8   2   1   85  59  19  20  97

8003    8   2   1   84  52  12  18  91

8004    11  2   1   85  44  17  20  92

8005    11  2   1   81  35  400 18  93

8006    11  1   1   190 56  20  17  97

Я хочу удалить ячейки, которые превышают 3-е число от среднего значения в зависимости от класса / пола и т. Д.

SubjNum Class   Genderm1f2  LRLevel exp1    exp2    exp3    exp4    exp5

8001    8   1   1   88  . 15    19  92

8002    8   2   1   85  59  19  20  97

8003    8   2   1   84  52  12  18  91

8004    11  2   1   85  44  17  20  92

8005    11  2   1   81  35  . 18    93

8006    11  1   1   .   56  20  17  97

1 Ответ

0 голосов
/ 04 ноября 2018

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

Моделирование dataFrame из вашего примера:

>>> df
   SubjNum  Class  Genderm1f2  LRLevel  exp1  exp2  exp3  exp4  exp5
0     8001      8           1        1    88     2    15    19    92
1     8002      8           2        1    85    59    19    20    97
2     8003      8           2        1    84    52    12    18    91
3     8004     11           2        1    85    44    17    20    92
4     8005     11           2        1    81    35   400    18    93
5     8006     11           1        1   190    56    20    17    97

Среднее значение на основе этих двух столбцов:

>>> df.groupby(['Class', 'Genderm1f2']).mean()
                  SubjNum  LRLevel   exp1  exp2   exp3  exp4  exp5
Class Genderm1f2
8     1            8001.0      1.0   88.0   2.0   15.0  19.0  92.0
      2            8002.5      1.0   84.5  55.5   15.5  19.0  94.0
11    1            8006.0      1.0  190.0  56.0   20.0  17.0  97.0
      2            8004.5      1.0   83.0  39.5  208.5  19.0  92.5

стандартное отклонение по этим двум столбцам:

>>> df.groupby(['Class', 'Genderm1f2']).std()
                   SubjNum  LRLevel      exp1      exp2        exp3      exp4      exp5
Class Genderm1f2
8     1                NaN      NaN       NaN       NaN         NaN       NaN       NaN
      2           0.707107      0.0  0.707107  4.949747    4.949747  1.414214  4.242641
11    1                NaN      NaN       NaN       NaN         NaN       NaN       NaN
      2           0.707107      0.0  2.828427  6.363961  270.821897  1.414214  0.707107

Просто группа по двум нужным столбцам с совокупностью mean() & std().

>>> df.groupby(['Class', 'Genderm1f2']).agg(['mean','std'])
                 SubjNum           LRLevel        exp1            exp2             exp3             exp4            exp5
                    mean       std    mean  std   mean       std  mean       std   mean         std mean       std  mean       std
Class Genderm1f2
8     1           8001.0       NaN       1  NaN   88.0       NaN   2.0       NaN   15.0         NaN   19       NaN  92.0       NaN
      2           8002.5  0.707107       1  0.0   84.5  0.707107  55.5  4.949747   15.5    4.949747   19  1.414214  94.0  4.242641
11    1           8006.0       NaN       1  NaN  190.0       NaN  56.0       NaN   20.0         NaN   17       NaN  97.0       NaN
      2           8004.5  0.707107       1  0.0   83.0  2.828427  39.5  6.363961  208.5  270.821897   19  1.414214  92.5  0.707107

Просто группа по двум желаемым столбцам с совокупностью mean() & std(), чьи значения больше 3.

>>> df.groupby(['Class', 'Genderm1f2']).agg(['mean','std']) > 3
                 SubjNum        LRLevel         exp1          exp2         exp3         exp4         exp5
                    mean    std    mean    std  mean    std   mean    std  mean    std  mean    std  mean    std
Class Genderm1f2
8     1             True  False   False  False  True  False  False  False  True  False  True  False  True  False
      2             True  False   False  False  True  False   True   True  True   True  True  False  True   True
11    1             True  False   False  False  True  False   True  False  True  False  True  False  True  False
      2             True  False   False  False  True  False   True   True  True   True  True  False  True  False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...