TypeError:数组 dtype 和格式说明符不匹配。如何将具有不同值类型的数据框保存为 txt 文件?

Posted

技术标签:

【中文标题】TypeError:数组 dtype 和格式说明符不匹配。如何将具有不同值类型的数据框保存为 txt 文件?【英文标题】:TypeError: Mismatch between array dtype and format specifier. How to save a dataframe with different value types as a txt file? 【发布时间】:2021-03-15 21:13:16 【问题描述】:

我有一个包含 10 列的数据框,每列包含不同类型的值: int,str,str,int,float,float,float,float,float,float

我想将我的 df 保存为 txt 文件。我使用此代码:

fmt = '%5f','%5s','%5s','%5f','%8.3f','%8.3f','%8.3f','%8.4f','%8.4f','%8.4f' np.savetxt(r'C:\Users\np.txt', df.values, fmt=fmt, delimiter="")

但我收到此错误:

数组 dtype('object')和格式说明符('%5f%5s%5s%5f%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f')不匹配

似乎每个值都需要相同的格式。

有什么方法可以将我的数据框保存为文本文件?

值的格式对我来说太重要了。遗憾的是,to_csv 会丢失格式。

提前致谢

梅尔努什

【问题讨论】:

你有什么理由不只是调用 df.to_csv 吗? 是的,我需要使用输出文件作为模拟软件的输入,它只读取文本文件。 to_csv 也可以保存为 .txt 文件。只需将文件名传递给方法,文本应该完全按照它在数据框中的显示方式保存 谢谢。当我使用 to_csv 时,.txt 文件会丢失格式 (fmt)。有哪些选项可以准确保存格式? df.values 是什么?形状和 dtype 开始。该错误暗示它是object dtype。所有savetxt 正在做的是:fmt%tuple(row) 对于df.values 的每一“行”(纯python 字符串格式)关于values 数组的某些内容与您指定的fmt 字符串不兼容。 【参考方案1】:

如果没有为列的原始类型正确指定格式,则会引发此错误。考虑下面的例子

import pandas as pd
import numpy as np

d = 
    'col_str': ['a', 'b', 'c'],
    'col_float': [1.5, 2.5, 0.7]

df = pd.DataFrame(d)
df

那么如果我尝试使用浮点格式保存 col_str 并使用字符串格式保存 col_float TypeError 将引发

fmt = ['%5f', '%5s']
np.savetxt(r'test.txt', df.values, fmt=fmt, delimiter="")
>>> TypeError: Mismatch between array dtype ('object') and format specifier ('%5f%5s')

否则,如果正确指定格式,它将起作用

fmt = ['%5s', '%.2f']
np.savetxt(r'test.txt', df.values, fmt=fmt, delimiter="")

【讨论】:

谢谢。我将原始数据框中的“int”格式更改为“float”,它起作用了!虽然这些数字实际上是整数,对我来说没有任何意义。

以上是关于TypeError:数组 dtype 和格式说明符不匹配。如何将具有不同值类型的数据框保存为 txt 文件?的主要内容,如果未能解决你的问题,请参考以下文章

GPT 2 - TypeError:无法根据规则“安全”将数组数据从 dtype('O') 转换为 dtype('int64')

TypeError:在绘制 seaborn.regplot 时,无法根据规则“安全”将数组数据从 dtype('int64') 转换为 dtype('int32')

pandas 比较引发 TypeError:无法将 dtyped [float64] 数组与 [bool] 类型的标量进行比较

Scipy hstack 导致“TypeError:类型不支持转换:(dtype('float64'),dtype('O'))”

TypeError:无法将值 dtype('<M8[ns]') 转换为 TensorFlow DType

numpy array TypeError:只有整数标量数组可以转换为标量索引