我最初只找到了一种解决方法,但没有找到解释:将列转换为字符串。
>>> df = pd.DataFrame({"A": [1234567, 1234567]})
>>> df["A"] = df.A.astype(str)
>>> print(df.to_markdown())
| | A |
|---:|--------:|
| 0 | 1234567 |
| 1 | 1234567 |
更新:
我认为是由2个因素引起的:
def _column_type(strings, has_invisible=True, numparse=True):
"""The least generic type all column values are convertible to.
可以通过tablefmt="pretty"禁用转换来解决:
print(df.to_markdown(tablefmt="pretty"))
+---+---------+
| | A |
+---+---------+
| 0 | 1234567 |
| 1 | 1234567 |
+---+---------+
- 当有多个列,并且其中之一包含
float 数字时。由于tabulate 使用df.values 提取数据,从而将DataFrame 转换为numpy.array,因此所有值随后都转换为相同的dtype (float)。 this issue 也对此进行了讨论。
>>> df = pd.DataFrame({"A": [1234567, 1234567], "B": [0.1, 0.2]})
>>> print(df)
A B
0 1234567 0.1
1 1234567 0.2
>>> print(df.A.dtype)
int64
>>> print(df.to_markdown(tablefmt="pretty"))
+---+-----------+-----+
| | A | B |
+---+-----------+-----+
| 0 | 1234567.0 | 0.1 |
| 1 | 1234567.0 | 0.2 |
+---+-----------+-----+
>>> df.values
array([[1.234567e+06, 1.000000e-01],
[1.234567e+06, 2.000000e-01]])