pandas str.replace - сохранить текущее значение, если регулярное выражение не удается избежать NaN при преобразовании строки в числа - PullRequest
2 голосов
/ 22 октября 2019

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.replace.html

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

0     20,7
1       22
2       21
3       20
4     24,4
5     23,8
6     23,6
7     21,6
8     24,3
9     23,3
10    24,2

....

17053      16
17054      16
17055      15
17056      15
17057      19
17058      17
17059      18
17060      19
17061      20
17062      21
17063      20

Я хочу преобразовать их как float.

Теперь я не могу напрямую применить метод astype или to_numeric, иначе строки с 20,7 не будут интерпретироваться.

Странно то, что если применить .str.replace(',', '.') к строкам, которые НЕ содержат шаблон, регулярное выражение завершается ошибкой и возвращается к NaN. Я ожидал бы замены, если шаблон найден, иначе вернул бы значение как есть.

Я также набрал .str.replace(',', '.', regex = False) безуспешно.

Пример:

Длятакие значения, как "20,7", точка замены на запятую работает нормально, и я могу затем преобразовать в число, получив число с плавающей запятой 20,7.

Но у меня также есть эти значения:

test['TMEDIA °C'][-10:]

17054    16
17055    15
17056    15
17057    19
17058    17
17059    18
17060    19
17061    20
17062    21
17063    20

и применить str.replace я получаю это:

test['TMEDIA °C'][-10:].str.replace(',', '.')

17054   NaN
17055   NaN
17056   NaN
17057   NaN
17058   NaN
17059   NaN
17060   NaN
17061   NaN
17062   NaN
17063   NaN

и не могу применить astype ко всему столбцу, вместо этого я хотел бы получить это:

test['TMEDIA °C'][-10:].astype(float)
17054    16.0
17055    15.0
17056    15.0
17057    19.0
17058    17.0
17059    18.0
17060    19.0
17061    20.0
17062    21.0
17063    20.0

Это ошибка str.replace () или как сохранить текущее значение в случае сбоя регулярного выражения?

Ответы [ 3 ]

2 голосов
/ 22 октября 2019

Те с NaN после replace, имеющие dtype int, поэтому replace возвращает NaN. Попробуйте принудительно преобразовать весь столбец в str перед вызовом str.replace

test['TMEDIA °C'].astype(str).str.replace(',', '.')
2 голосов
/ 22 октября 2019

Скорее всего, у вас есть столбец со смешанными типами данных, что-то вроде этого:

fails = pd.DataFrame([['1,2'], [3]], columns=['a'])
print(fails['a'].str.replace(',', '.'))  # results in NaN

Как столбец оказался таким, это другой вопрос. Если вместо этого было указано:

works = pd.DataFrame([['1,2'], ['3']], columns=['a'])

, то это работает.

Смешанные типы данных могут, например, возникнуть, если вы объедините два фрейма данных:

df1 = pd.DataFrame([['1,2']], columns=['a'])
df2 = pd.DataFrame([[3]], columns=['a'])
fails = pd.concat([df1, df2])

Если df2 был сгенерирован read_csv и не имел значений ",", тогда он автоматически разбирается, например, на числа, а не на строки.

Вы можете избежать проблемы с NaN, используя .str.replace в данныхфрейм, который содержит значения запятой, здесь df1, до , конкатенируемый с другим фреймом данных, или гарантирующий, что столбец другого фрейма данных (здесь d2['a']) также имеет dtype=str (например, черезread_csv(..., dtype=str)).

0 голосов
/ 23 октября 2019
s = pd.Series(['foo', 'fuz', 'some other'])
idx = s[s.str.contains(r'f', regex=True)].index
s.loc[idx] = s.loc[idx].str.replace('f', 'F')
display(s)

0           Foo 
1           Fuz
2    some other
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...