Нарезать несколько кадров данных на основе значений разных диапазонов в определенном столбце и классифицировать их в новых столбцах - PullRequest
0 голосов
/ 27 августа 2018

Можно ли выбрать значения в пределах 5 определенных диапазонов для данного столбца и для каждого отдельного кадра данных применить в новом столбце метку?

Я имею в виду, у меня есть список данных. Все кадры данных имеют 2 столбца и имеют один и тот же первый столбец, но отличаются по второму (заголовок и значения). Например:

>> df1
   GeneID   A
     1     0.3 
     2     0.0
     3     143
     4      9
     5     0.6

>> df2
   GeneID   B
     1     0.2 
     2     0.3
     3     0.1
     4     0.7
     5     0.4

  ....

Я бы хотел:

  1. Для каждого кадра данных в списке выполните вычисление, которое дает вероятность того, что это значение произойдет в пределах 1 из 5 различных диапазонов. Добавить новый столбец с этими значениями;

  2. Для каждого кадра данных в списке прикрепите соответствующую метку диапазона в другом новом столбце.

Где диапазоны:

*Range_Values* -> *Range_Label*

   **[0]**     ->   'l1'

  **]0,1]**    ->   'l2'

 **]1,10]**    ->   'l3'

**]10,100]**   ->   'l4'

  **>100**        'l5'

Этот 2-х шаговый подход привел бы к чему-то вроде:

>> list_dfs[df1]
   GeneID    A    Prob_val     Exp_prof
      1     0.3     0.4         'l2'
      2     0.0     0.2         'l1'
      3     143     0.2         'l5'
      4      9      0.2         'l3'
      5     0.6     0.4         'l2'

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Для этикеток и корзин вы можете использовать pandas.cut. Обратите внимание, что вы не можете использовать синглтон в качестве корзины в этой функции. Поэтому вам придется создать его потом. Вот как вы можете это сделать.

Сначала я воссоздаю один из ваших фреймов данных:

    import io
temp = u"""
GeneID    A
      1     0.3
      2     0.0
      3     143
      4      9
      5     0.6"""
foo = pd.read_csv(io.StringIO(temp),delim_whitespace = True)

Затем я создаю новый столбец и заполняю значения NaN меткой l1, которая соответствует синглтону [0].

foo['Exp_prof'] = pd.cut(foo.A,bins = [0,1,10,100,np.inf],labels = ['l2','l3','l4','l5'])
foo['Exp_prof'] = foo['Exp_prof'].cat.add_categories(['l1'])
foo['Exp_prof'] = foo['Exp_prof'].fillna('l1')

И я использую этот новый столбец для вычисления вероятностей:

foo['Prob_val'] = foo.Exp_prof.map((foo.Exp_prof.value_counts()/len(foo)).to_dict())

И вывод:

    GeneID  A       Exp_prof    Prob_val
0   1       0.3     l2          0.4
1   2       0.0     l1          0.2
2   3       143.0   l5          0.2
3   4       9.0     l3          0.2
4   5       0.6     l2          0.4
0 голосов
/ 27 августа 2018

Сначала нужно определить ячейки и метки -

bins = [0, 1, 10, 100, float("inf")]
labels = ['l1', 'l2', 'l3', 'l4', 'l5']

Затем используйте pd.cut() -

pd.cut(df1['A'], bins, right=False)

В pd.cut() есть параметр labels, который можно использовать для получения меток -

pd.cut(df1['A'], bins, labels=labels, right=False)

Вы можете использовать bins, сгенерированный для вычисления вероятностей. Я оставляю это на ваше усмотрение.

Вы можете сделать это для остальной части dfs в цикле и, наконец, назначить их списку -

list_dfs = [df1, df2, ...]

Если у вас динамическое число dfs, используйте цикл -

Framework

for df in dfs:
    df['bins'] = pd.cut(df['A'], bins, right=False)
    df['label'] = pd.cut(df['A'], bins, labels=labels, right=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...