после concat значения изменились на float и не остались в int (попытался преобразовать его перед concat.) - PullRequest
1 голос
/ 17 января 2020

Сначала я попытался изменить информацию (серию) обратно на int, а затем, после того, как я перевел ее обратно, она вернулась обратно к float>

import pandas as pd

df1= pd.DataFrame({'a': [1,2,3, None,5,6,7,8,9,10],
                  'code': ['a{}'.format(i+1) for i in range(10)]})
df2 = pd.DataFrame({'code': ['a{}'.format(i+1) for i in range(5)]})

df1['a'] = pd.to_numeric(df1['a'], errors='coerce')
df1_temp = df1.dropna(subset=['a'])
df1_temp_2 = df1[df1['a'].isnull()]
df1_temp['a'] = df1_temp['a'].astype(int)
df1_a = pd.concat([df1_temp, df1_temp_2], axis=0)
df1_a.sort_index(axis=0)
df1_a

output:

    a   code
0   1.0 a1
1   2.0 a2
2   3.0 a3
3   NaN a4
4   5.0 a5
5   6.0 a6
6   7.0 a7
7   8.0 a8
8   9.0 a9
9   10.0    a10

Ожидаемое:

    a   code
0   1   a1
1   2   a2
2   3   a3
3   NaN a4
4   5   a5
5   6   a6
6   7   a7
7   8   a8
8   9   a9
9   10  a10

Есть ли у вас хорошие предложения? короче и больше pandas способ?

1 Ответ

1 голос
/ 17 января 2020

Это возможно в pandas 0.24+ с обнуляемым целочисленным типом данных :

df1['a'] = pd.to_numeric(df1['a'], errors='coerce').astype('Int64')
print (df1)
     a code
0    1   a1
1    2   a2
2    3   a3
3  NaN   a4
4    5   a5
5    6   a6
6    7   a7
7    8   a8
8    9   a9
9   10  a10

РЕДАКТИРОВАТЬ: Если хотите преобразовать целые числа в read_csv ( если целые числа были записаны в файл):

df1= pd.DataFrame({'a': [1,2,3, None,5,6,7,8,9,10],
                  'code': ['a{}'.format(i+1) for i in range(10)]})
df1['a'] = pd.to_numeric(df1['a'], errors='coerce').astype('Int64')

df1.to_csv('test.csv', index=False)

df = pd.read_csv('test.csv', dtype={'a':'Int64'})
print (df)
     a code
0    1   a1
1    2   a2
2    3   a3
3  NaN   a4
4    5   a5
5    6   a6
6    7   a7
7    8   a8
8    9   a9
9   10  a10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...