Остановить 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
.
-
Мне также нужны данные, вставленные по строкам.
Ответы
Ответ 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