Python - конвертировать число с плавающей точкой в ​​столбец панды - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть pandas dataframe как:

df3 = pd.DataFrame({
'T': [11.0,22.0,11.23,20.03],
'v2': [11.0,13.0,55.1,33.0],
'v3' : [112.1,2.0,2.1,366.0],
'v4': [np.nan, "blue", 1.0, 2.0]
 })

       T    v2     v3    v4
0  11.00  11.0  112.1   NaN
1  22.00  13.0    2.0  blue
2  11.23  55.1    2.1   1.0
3  20.03  33.0  366.0   2.0

, и у меня должно быть:

    T       v2     v3    v4
0  11     11.0  112.1   NaN
1  22     13.0    2.0  blue
2  11.23  55.1    2.1   1.0
3  20.03  33.0  366.0   2.0

Так что мне нужно преобразовать число с плавающей точкой в ​​целое только на 'T'.

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Используя ту же идею @jezrael, но с is_integer :

import numpy as np
import pandas as pd

df3 = pd.DataFrame({
    'T': [11.0, 22.0, 11.23, 20.03],
    'v2': [11.0, 13.0, 55.1, 33.0],
    'v3': [112.1, 2.0, 2.1, 366.0],
    'v4': [np.nan, "blue", 1.0, 2.0]
})

df3['T'] = np.array([int(x) if float(x).is_integer() else x for x in df3['T']], dtype=object)

print(df3)

Выход

T    v2     v3    v4
0     11  11.0  112.1   NaN
1     22  13.0    2.0  blue
2  11.23  55.1    2.1     1
3  20.03  33.0  366.0     2

Или используя numpy.where с numpy.fmod :

mask = np.fmod(df3['T'].values, 1) == 0
df3['T'] = np.where(mask, df3['T'].values.astype(np.int), df3['T']).astype(dtype=object)
print(df3)
0 голосов
/ 13 декабря 2018

Или почему бы и нет:

df3=df3.apply(lambda x: int(x) if int(x)==x and x==x and isinstance(x,float) else x)

А теперь:

print(df3)

Ожидается ли выход:

    T       v2     v3    v4
0  11     11.0  112.1   NaN
1  22     13.0    2.0  blue
2  11.23  55.1    2.1   1.0
3  20.03  33.0  366.0   2.0
0 голосов
/ 13 декабря 2018

Возможно, но немного взломать, потому что необходимо преобразовать в object:

df3['T'] = np.array([int(x) if int(x) == x else x for x in df3['T']], dtype=object)
print (df3)
       T    v2     v3    v4
0     11  11.0  112.1   NaN
1     22  13.0    2.0  blue
2  11.23  55.1    2.1     1
3  20.03  33.0  366.0     2

print (df3['T'].tolist())
[11, 22, 11.23, 20.03]

Если возможно, пропущенные значения:

df3 = pd.DataFrame({
'T': [11.0,22.0,11.23,np.nan],
'v2': [11.0,13.0,55.1,33.0],
'v3' : [112.1,2.0,2.1,366.0],
'v4': [np.nan, "blue", 1.0, 2.0]
 })


df3['T'] = np.array([int(x) if x % 1 == 0 else x for x in df3['T']], dtype=object)
print (df3)
       T    v2     v3    v4
0     11  11.0  112.1   NaN
1     22  13.0    2.0  blue
2  11.23  55.1    2.1     1
3    NaN  33.0  366.0     2

print (df3['T'].tolist())
[11, 22, 11.23, nan]
...