Подтвердить что ты не робот

Остановить Pandas от преобразования int в float

У меня есть DataFrame. Два соответствующих столбца: столбец int, а другой - столбец str.

Я понимаю, что если я вставляю NaN в столбец int, Pandas преобразует все int в float, потому что для int нет значения NaN.

Однако, когда я вставляю None в столбец str, Pandas также преобразует все мои int в float. Это не имеет смысла для меня - почему значение, которое я помещаю в столбце 2, влияет на столбец 1?

Вот простой рабочий пример (Python 2):

import pandas as pd
df = pd.DataFrame()
df["int"] = pd.Series([], dtype=int)
df["str"] = pd.Series([], dtype=str)
df.loc[0] = [0, "zero"]
print df
print
df.loc[1] = [1, None]
print df

Выходной сигнал

   int   str
0    0  zero

   int   str
0  0.0  zero
1  1.0   NaN

Есть ли способ сделать вывод следующим:

   int   str
0    0  zero

   int   str
0    0  zero
1    1   NaN

не переведя первый столбец в int.

  • Я предпочитаю использовать int вместо float, потому что фактические данные в этот столбец является целым числом. Если нет обходного пути, я просто используйте float, хотя.

  • Я предпочитаю не переделывать, потому что в моем фактическом коде я не сохраните фактический dtype.

  • Мне также нужны данные, вставленные по строкам.

4b9b3361

Ответ 1

Если вы установите dtype=object, ваша серия будет содержать произвольные типы данных:

df["int"] = pd.Series([], dtype=object)
df["str"] = pd.Series([], dtype=str)
df.loc[0] = [0, "zero"]
print(df)
print()
df.loc[1] = [1, None]
print(df)

   int   str
0    0  zero
1  NaN   NaN

  int   str
0   0  zero
1   1  None

Ответ 2

это работает так же хорошо:

df["int"] = df["int"].astype(int)

с fooobar.com/questions/10880322/...

РЕДАКТИРОВАТЬ: Это не работает так хорошо, когда в столбце есть пробелы :(

Ответ 3

Если вы используете DataFrame.append для добавления данных, dtypes сохраняются, и вам не нужно переделывать или полагаться на object:

In [157]: df
Out[157]:
   int   str
0    0  zero

In [159]: df.append(pd.DataFrame([[1, None]], columns=['int', 'str']), ignore_index=True)
Out[159]:
   int   str
0    0  zero
1    1  None