Pandas: выбор и изменение фрейма данных на основе еще более сложных критериев - PullRequest
0 голосов
/ 30 мая 2018

Я смотрел на эту и эту ветку, и хотя мой вопрос не так уж и отличается, он имеет несколько отличий.У меня есть датафрейм, полный floats, который я хочу заменить на строки.Скажем:

      A     B       C
 A    0     1.5     13
 B    0.5   100.2   7.3
 C    1.3   34      0.01

В этой таблице я хочу заменить на несколько критериев, но работает только первая замена:

df[df<1]='N' # Works
df[(df>1)&(df<10)]#='L' # Doesn't work
df[(df>10)&(df<50)]='M'  # Doesn't work
df[df>50]='H'  # Doesn't work

Если я вместо этого сделаю выбор для 2-й строки на основеfloat, все еще не работает:

((df.applymap(type)==float) & (df<10) & (df>1)) #Doesn't work

Мне было интересно, как применить pd.DataFrame().mask здесь или любым другим способом.Как мне решить эту проблему?

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

Редактировать: Может ли кто-нибудь объяснить, почему4 простых задания выше не работают?

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Вы можете использовать searchsorted

Копировать

labels = np.array(list('NLMH'))
breaks = np.array([1, 10, 50])
pd.DataFrame(
    labels[breaks.searchsorted(df.values)].reshape(df.shape),
    df.index, df.columns)

   A  B  C
A  N  L  M
B  N  H  L
C  L  M  N

На месте

labels = np.array(list('NLMH'))
breaks = np.array([1, 10, 50])
df[:] = labels[breaks.searchsorted(df.values)].reshape(df.shape)
df

   A  B  C
A  N  L  M
B  N  H  L
C  L  M  N

Цепное чистоеПодход панд с pandas.DataFrame.mask

Устаревший с версии 0.21

df.mask(df.lt(1), 'N').mask(df.gt(1) & df.lt(10), 'L') \
  .mask(df.gt(10) & df.lt(50), 'M').mask(df.gt(50), 'H')

   A  B  C
A  N  L  M
B  N  H  L
C  L  M  N
0 голосов
/ 30 мая 2018

Используя pd.cut

pd.cut(df.stack(),[-1,1,10,50,np.inf],labels=list('NLMH')).unstack()
Out[309]: 
   A  B  C
A  N  L  M
B  N  H  L
C  L  M  N
0 голосов
/ 30 мая 2018

Использование numpy.select с конструктором DataFrame:

m1 = df < 1
m2 = (df>1)&(df<10)
m3 = (df>10)&(df<50)
m4 = df>5

vals = list('NLMH')

df = pd.DataFrame(np.select([m1,m2,m3,m4], vals), index=df.index, columns=df.columns)
print (df)
   A  B  C
A  N  L  M
B  N  H  L
C  L  M  N
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...