import pandas as pd
df = pd.DataFrame({'test': ['34343_43434']})
json = df.to_json(orient='records')
result = pd.read_json(json, orient='records')
print(result)
saída:
teste
0 3434343434
O Pandas parece estar convertendo a string inicial ("34343_43434") em um número inteiro (3434343434) e remove o sublinhado para fazer isso.
Isso ocorre apenas quando todos os caracteres na string (além do sublinhado) são inteiros. Por exemplo, se o valor inicial fosse "34343_43434X", a saída seria corretamente "34343_43434X". Esse problema não ocorre quando dtypes = False.
test
0 34343_43434
pd.show_versions()
[cole o resultado de pd.show_versions()
aqui abaixo desta linha]
commit: Nenhum
python: 3.6.1.final.0
python-bits: 64
SO: Windows
Versão do sistema operacional: 10
máquina: AMD64
processador: Intel64 Family 6 Model 78 Stepping 3, GenuineIntel
byteorder: pouco
LC_ALL: Nenhum
LANG: Nenhum
LOCALE: Nenhum. Nenhum
pandas: 0,20,3
pytest: 3.0.7
pip: 9.0.1
ferramentas de configuração: 27.2.0
Cython: 0.25.2
numpy: 1.12.1
scipy: 0.19.0
xarray: Nenhum
IPython: 5.3.0
esfinge: 1.5.6
patsy: 0.4.1
dateutil: 2.6.0
pytz: 2017.2
blosc: nenhum
gargalo: 1.2.1
tabelas: 3.2.2
numexpr: 2.6.2
pena: nenhuma
matplotlib: 2.0.2
openpyxl: 2.4.7
xlrd: 1.0.0
xlwt: 1.2.0
xlsxwriter: 0.9.6
lxml: 3.7.3
bs4: 4.6.0
html5lib: 0,999
sqlalchemy: 1.1.9
pymysql: Nenhum
psycopg2: Nenhum
jinja2: 2.9.6
s3fs: nenhum
pandas_gbq: Nenhum
pandas_datareader: Nenhum
Consegui replicar isso no python 3.6.2, mas não no 3.5.3. Não tenho certeza porque embora
Deve estar relacionado ao PEP 515
Sou capaz de fazer coisas assim no 3.6, mas não no 3.5
In [5]: num = 34343_43434
In [6]: type(num)
Out[6]: int
In [7]: num
Out[7]: 3434343434
esse é um efeito colateral infeliz do estímulo, mas parece válido para mim.