Панды вычисляют новый столбец, отделяя необязательные ведущие нестроковые символы - PullRequest
1 голос
/ 11 июля 2019

Я новичок в Pandas и пытаюсь добавить ДВА новых столбца со значениями, рассчитанными из существующего столбца «Результат».

Существующий столбец содержит числа с необязательным квалификатором ('<', '>', '<>').

Некоторые номера примеров в «Результате» могут быть следующими:

0.5
12.67
3
<1
4.5
>10.0

Мне нужен новый столбец «Result_Q», который включает нечисловой квалификатор, еслион существует и NULL (нет) в противном случае, а также новый столбец Result_Value, который включает числовой компонент.

Моя первая попытка, которая не работает:

df['Result_Q'] = df.Result.str[0] if not df.Result.str[0].isdigit() else None

Это приводит к ошибке AttributeError: 'Series' object has no attribute 'isdigit'

(Изучив эту ошибку, я попробовал несколько других вариантов, которые дают ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all())

Ответы [ 3 ]

1 голос
/ 11 июля 2019

Вы можете использовать df.apply для создания нового столбца:

import pandas as pd
df = pd.DataFrame({'result': ['0.5', '12.67', '<1', '4.5', '>10.0']})
df['Result_Q'] = df['result'].apply(lambda x: x[0] if not x[0].isdigit() else None)
print(df)


  result Result_Q
0    0.5     None
1  12.67     None
2     <1        <
3    4.5     None
4  >10.0        >
1 голос
/ 11 июля 2019

Использование Series.str.isdigit с numpy.where:

df['Result_Q'] = np.where(df.Result.str[0].str.isdigit(), None, df.Result.str[0])

Альтернатива с Series.mask:

df['Result_Q'] = df.Result.str[0].mask(df.Result.str[0].str.isdigit(), None)

print (df)
  Result Result_Q
0    0.5     None
1  12.67     None
2      3     None
3     <1        <
4    4.5     None
5  >10.0        >

Или Series.str.extract с изменением NaN на None:

df['Result_Q'] = df.Result.str[0].str.extract('(\D)').mask(lambda x: x.isna(), None)
print (df)
  Result Result_Q
0    0.5     None
1  12.67     None
2      3     None
3     <1        <
4    4.5     None
5  >10.0        >
0 голосов
/ 11 июля 2019

Или попробуйте:

df['Result_Q'] = df['Result'].str.replace('\d+', '').str.strip('.').replace('', np.nan)
print(df)

Вывод:

  Result Result_Q
0    0.5      NaN
1  12.67      NaN
2      3      NaN
3     <1        <
4    4.5      NaN
5  >10.0        >
...