Как умножить два столбца, которые включают тире (-)? - PullRequest
0 голосов
/ 18 октября 2019
df = pd.DataFrame({
                  'A': [15, '-', 173, 190, 68],
                  'B': ['-', 254, '-', 16, 76],
                  'C': [12, '-', 110, 35, 98],
                  'D': [125, 89, 308, 211, 174],
                  'E': [19, 21, '-', 162, '-']
                  })

У меня есть два столбца, которые я хочу умножить друг на друга, но эти столбцы включают «-». Перед преобразованием тире в плавающее число или заменой на 0, я могу сделать умножение, но я не хочу слишком много тире. Кроме того, когда я экспортирую свои данные в Excel, из-за этих черточек мои данные преобразуются в строку. Я хочу, чтобы все они были целыми или плавающими, но включали тире. Является ли это возможным? Как я могу умножить эти столбцы, не удаляя тире (-)?

1 Ответ

1 голос
/ 18 октября 2019

Я думаю, что ваша идея лучше всего - заменить - на что-то числовое, например, NaN, потому что для кратных необходимы все числовые значения:

df = df.mask(df.values == '-').astype(float)

Или:

df = df.apply(pd.to_numeric, errors='coerce')

print (df)
       A      B      C      D      E
0   15.0    NaN   12.0  125.0   19.0
1    NaN  254.0    NaN   89.0   21.0
2  173.0    NaN  110.0  308.0    NaN
3  190.0   16.0   35.0  211.0  162.0
4   68.0   76.0   98.0  174.0    NaN

Последнее, если необходимо - назад:

df = df.fillna('-')

Или преобразовать отсутствующие значения по параметру na_rep в DataFrame.to_excel:

df.to_excel(file, na_rep='-')

Но это возможно с функцией try-wait, но очень медленно, поэтому не рекомендуется:

def mult_with_dash(x):
    try:
        return float(x['A']) * float(x['E']) 
    except Exception:
        return '-'

df['new'] = df.apply(mult_with_dash, axis=1)
print (df)
     A    B    C    D    E    new
0   15    -   12  125   19    285
1    -  254    -   89   21      -
2  173    -  110  308    -      -
3  190   16   35  211  162  30780
4   68   76   98  174    -      -
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...