Преобразование данных в кадре данных Pandas [дубликат]

Как уже упоминалось, отображение: inline - это, вероятно, то, что вы хотите. Некоторые браузеры также поддерживают встроенные блоки.

http://www.quirksmode.org/css/display.html#inlineblock

14
задан Korem 10 June 2018 в 18:57
поделиться

2 ответа

Начиная с v0.17, convert_objects устарел.

Чтобы преобразовать серию в числовое значение, используйте pd.to_numeric с помощью кнопки errors='coerce' -

s = pd.Series(['1','2','3','4','.'])
pd.to_numeric(s, errors='coerce')

0    1.0
1    2.0
2    3.0
3    4.0
4    NaN
dtype: float64

Если вам нужно заполнить NaN s, используйте pd.Series.fillna -

pd.to_numeric(s, errors='coerce').fillna(0, downcast='infer')

0    1
1    2
2    3
3    4
4    0
dtype: float64

Примечание. downcast='infer' попытается сбрасывать поплавки к целым числам, где это возможно. Удалите аргумент, если вы этого не хотите.


pd.DataFrame

В случае, если кто-то заинтересован в том, как продлить это на dataframes, вот как -

df = pd.DataFrame({'A' : np.random.choice(10, 10), 
                   'B' : ['1', '2', '3', '4', '###', '...', 50, '234', '34', '23'], 
                   'C' : np.random.choice(10, 10), 
                   'D' : ['23', '1', '...', '268', '34', '21', '$$', '34', '4567', '0']})
df

   A    B  C     D
0  2    1  2    23
1  9    2  0     1
2  2    3  4   ...
3  9    4  9   268
4  0  ###  3    34
5  8  ...  6    21
6  5   50  2    $$
7  3  234  4    34
8  4   34  9  4567
9  8   23  0     0

df.dtypes

A     int64
B    object
C     int64
D    object
dtype: object

Если вы не знаете, какие столбцы не являются числовыми, запросите dtypes и получите маску -

df.dtypes.eq(object)

A    False
B     True
C    False
D     True
dtype: bool

cols = df.columns[df.dtypes.eq(object)]
cols
Index(['B', 'D'], dtype='object')

Теперь используйте маску для фильтрации по столбцам и apply pd.to_numeric -

df[cols] = df[cols].apply(pd.to_numeric, errors='coerce', axis=0)

Или,

for c in cols:
    df[c] = pd.to_numeric(df[c], errors='coerce')

df

   A      B  C       D
0  2    1.0  2    23.0
1  9    2.0  0     1.0
2  2    3.0  4     NaN
3  9    4.0  9   268.0
4  0    NaN  3    34.0
5  8    NaN  6    21.0
6  5   50.0  2     NaN
7  3  234.0  4    34.0
8  4   34.0  9  4567.0
9  8   23.0  0     0.0

Применение pd.to_numeric вдоль столбцов должно быть немного быстрее в течение длительного времени dataframes. Для широких фреймов данных используйте axis=1.

15
ответ дан Korem 17 August 2018 в 12:33
поделиться
  • 1
    Это потрясающе :-). Мы должны обновлять эту вещь, поскольку левый устаревший метод на этом сайте не подходит для будущего посетителя :-), вы сделали это – Wen 23 December 2017 в 17:28
  • 2
    @Wen Спасибо! Пожалуйста, не стесняйтесь также предлагать улучшения. – coldspeed 23 December 2017 в 17:29
  • 3
    Ага, может быть, вы можете добавить s.str.isalnum() :-) в сочетании с mask – Wen 23 December 2017 в 17:31
  • 4
    @Wen Вы имеете в виду s.str.isdigit()? Он будет работать только для целых чисел, а не для плавающих. Хорошая идея. – coldspeed 23 December 2017 в 17:32
  • 5
    @Wen, как я знаю, to_numeric здесь золото. – Dark 23 December 2017 в 17:33
In [30]: pd.Series([1,2,3,4,'.']).convert_objects(convert_numeric=True)
Out[30]: 
0     1
1     2
2     3
3     4
4   NaN
dtype: float64
18
ответ дан Jeff 17 August 2018 в 12:33
поделиться
  • 1
    Я думаю, что я снова использовал функцию raise_on_error. Ничего не делает ATM. – Jeff 20 September 2014 в 21:09
  • 2
    Я открыл проблему для улучшения здесь: github.com/pydata/pandas/issues/8332 , не стесняйтесь комментировать предлагаемый API – Jeff 20 September 2014 в 21:12
  • 3
    В 0.14.1 он не позволяет исключить исключение. Без указания этого оператора astype возникла бы ошибка. – Korem 20 September 2014 в 21:12
  • 4
    извините, что вы правы. Вот почему никогда не ПРОСТО читать код, проверяйте его :) – Jeff 20 September 2014 в 21:13
  • 5
    .convert_objects() метод устарел с 0,17, pd.to_numeric - это новый способ. – YaOzI 3 November 2016 в 09:05
Другие вопросы по тегам:

Похожие вопросы: