pandas проверка, являются ли отдельные значения в DataFrame цифрами - PullRequest
0 голосов
/ 22 марта 2020

У меня есть фрейм данных, который выглядит так:

   a      b        c       d
-1000   2000.1     NaN    text1
NaN     -500       450    text2
1240.6   NaN       -100   text3

Некоторые значения содержат десятичную дробь, некоторые содержат отрицательный знак, а некоторые целые.

Я хочу объединить формат из всех столбцов, содержащих целые числа, должны быть числами с 0. то есть -1000 должно быть -1000.000 и т. д.

Подход, который я использую, довольно прост, но он не работает. Я пробовал это:

df = df.apply(lambda x: x.astype(str) + '.000' if x.str.isnumeric().all() else x)

Однако эта функция не работает должным образом, поскольку она проверяет, является ли весь pd.Series цифрой c, что не всегда так.

Как я могу улучшить эту функцию, чтобы просматривать каждое отдельное значение и добавлять .000 при необходимости?

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Определите следующую функцию:

def floatStr3(x):
    try:
        return f'{float(x):.3f}'
    except:
        return x

Затем примените ее к каждому элементу:

df.applymap(floatStr3)
0 голосов
/ 22 марта 2020

IIU C аналогично вашему текущему методу, вы можете попробовать пользовательскую функцию с pd.to_numeric + applymap, обратите внимание, что форматирование с плавающей точкой изменит dtypes

def myf(x):
    s = pd.to_numeric(x,errors='coerce')
    return np.where(pd.notna(s),'{0:.3f}'.format(s),x)

df.applymap(myf)

           a         b         c      d
0  -1000.000  2000.100       nan  text1
1        nan  -500.000   450.000  text2
2   1240.600       nan  -100.000  text3
...