Импорт из excel в датафрейм и обратно в excel
Cчитываю из экселя строки, которые определены как строчный тип данных, но пандас почему-то их превращает то в numpy.int64, то numpy.float64. Из-за этого при переносе в эксель идет округление, что мне не нужно. Вопрос: почему пандас превращает строку в число и как этого не допустить? При переносе с sql таких трудностей нет.
import pandas as pd
xlsx = pd.read_excel("input2.xlsx")
xlsx.index += 1
with pd.ExcelWriter("output_ex.xlsx") as writer:
xlsx.to_excel(writer)
print(xlsx.iloc[0]["A6"])
print(type(xlsx.iloc[0]["A6"]))
ссылка на эксель: https://docs.google.com/spreadsheets/d/1X_3lsWqHW-pe9V8BFq6eqXXkRYaP73CQ/edit#gid=2011771124
Ответы (1 шт):
Воспользуйтесь параметром dtype:
df = pd.read_excel("input2.xlsx", dtype={"A6": str})
результат:
In [84]: df["A6"]
Out[84]:
0 5853400884000091
1 5847040869000192
2 5855540881000038
3 5855640873000093
4 5897899797000395
Name: A6, dtype: object # <--- NOTE !
Из документации:
dtype Type name or dict of column -> type, default None Data type for data or columns. E.g.
{‘a’: np.float64, ‘b’: np.int32}Use object to preserve data as stored in Excel and not interpret dtype. If converters are specified, they will be applied INSTEAD of dtype conversion.
Проверка кода на Pandas 1.4.1, OpenPyxl 3.0.9:
In [1]: df = pd.read_excel("input2.xlsx", dtype={"A6": "str"})
In [2]: df["A6"]
Out[2]:
0 5853400884000091
1 5847040869000192
2 5855540881000038
3 5855640873000093
4 5897899797000395
Name: A6, dtype: object
In [3]: pd.__version__
Out[3]: '1.4.1'