Преобразование объекта в плавающий в кадре данных с помощью панд

avatar
SQL Learner 1
9 августа 2021 в 05:01
121
2
1

Используемые данные: https://drive.google.com/file/d/1nU1wCZFpp-0_qoom3L1GhhGI6obX5GhB/view?usp=sharing

Я пытаюсь сделать столбец world_rank числом с плавающей запятой. Я использовал следующий код для других столбцов, который изменил код, но когда я пытаюсь сделать это для столбца world_rank, это дает мне ошибку:

times_df['world_rank'] = times_df['world_rank'].replace('-', np.nan)
times_df['world_rank'] = times_df['world_rank'].astype(float)

Поскольку некоторые данные представляют собой диапазон (601-800), я пробовал следующее, что также не работает:

# replace ranking range to midpoint
def mid_rank(rank_string):
    rank = re.sub('=', '', rank_string)
    rank = rank.split('-')
    s = 0
    for each in rank:
        each = float(each)
        s = s + each
    return s/len(rank)

# replace ranking range for times data
times_df['world_rank_tidy'] = times_df['world_rank'].apply(mid_rank)
Источник

Ответы (2)

avatar
Henry Ecker
9 августа 2021 в 05:12
1

We can try replacing the columns with their mean value by masking where str.contains the - and then split and take средний ряд. Со знаком =, replace с '' для удаления. Наконец, преобразуйте значения столбца to_numeric:

# Mask Rows which contain the -
m = df['world_rank'].str.contains('-', na=False)
# Replace with the average of the values
df.loc[m, 'world_rank'] = (
    df.loc[m, 'world_rank'].str.split('-', expand=True).astype(int).mean(axis=1)
)
# Remove = sign
df['world_rank'] = df['world_rank'].replace('=', '', regex=True)
# Convert column to numeric
df['world_rank'] = pd.to_numeric(df['world_rank'])

Пример данных:

import numpy as np
import pandas as pd

df = pd.DataFrame({
    'world_rank': {0: '=39', 1: '=47', 2: '351-400', 3: '351-400',
                   4: '351-400', 5: '351-400', 6: '1', 7: '2', 8: '3', 9: '4',
                   10: '5', 11: '6', 12: '7', 13: np.nan}
})
   world_rank
0         =39  # Equal sign pattern
1         =47
2     351-400  # Dash Pattern
3     351-400
4     351-400
5     351-400
6           1  # Normal Numbers
7           2
8           3
9           4
10          5
11          6
12          7
13        NaN  # Missing values

Пример вывода:

    world_rank
0         39.0  # Number without equal sign
1         47.0
2        375.5  # Midpoint between 351 and 400
3        375.5
4        375.5
5        375.5
6          1.0  # Just the number
7          2.0
8          3.0
9          4.0
10         5.0
11         6.0
12         7.0
13         NaN  # Still NaN
avatar
Ibrahim Ayoup
9 августа 2021 в 05:16
1

Используйте str.replace, чтобы заменить часть текста в пандах:

df['world_rank'] = df['world_rank'].str.replace('-','')
df['world_rank'] = df['world_rank'].str.replace('=','')

Затем преобразовать в число с плавающей запятой:

df['world_rank'] = df['world_rank'].astype(float)