python - Pandas 从具有未知列名的给定数据类型的 csv 中读取列

标签 python excel pandas dataframe

我正在尝试从 Excel 文件导入数据框 (df_model)。 excel 文件中此数据框的第一列有整数 1、2、3、4、5,我想将它们读取为整数而不是小数或浮点值。但是每当我尝试通过 pandas 读取它们时,它会将第一列中的值转换为十进制,如 1.0、2.0、3.0、4.0、5.0。然而,其余列中的值仍然是我想要的方式。这是 pandas 读取的数据框。

    Std S_Ultra S_Classic  ... SMV34_Ultra SMV34_Classic SMV34_Ultra for Flow
0    1.0      1A        1A  ...         1.0           1.0                  2.0
1    2.0      2A        2A  ...         2.0           2.0               2 SP=5
2    3.0      3A        3A  ...      2 SP=5        2 SP=5                  3.0
3    4.0      4A        4A  ...         3.0           3.0               3 SP=5
4    5.0      5A        5A  ...      3 SP=5        3 SP=5                  NaN
..   ...     ...       ...  ...         ...           ...                  ...
100  NaN     NaN       NaN  ...         NaN           NaN                  NaN

有没有可能pandas默认不把第一列转成十进制值?

最佳答案

是的,您可以在使用 pandas 阅读时指定列的类型 read_csv

df = pd.read_csv('filename.csv', dtype={'Std': 'Int32'})

pandas 会将缺失值设置为 <NA>

编辑: 正如评论中所讨论的,列的名称事先是未知的,但是这里已知的是第一列或第 n 列将包含 int, float, string数据

在读取数据时,我们可以指定列号和数据类型。该列将以您指定的数据类型读取。我们将跳过标题行,单独读取并稍后分配标题。

0这里是第一个列号

df = pd.read_csv(r'filename.csv', skiprows = 1,  dtype={'0': 'int'}, header = None)
headers = pd.read_csv(r"filename.csv", nrows=0).columns
df.columns = headers

上面的代码会给你预期的输出

EDIT2:如果不对 csv 进行一次遍历以检查哪些列是 integer, float and string,就不可能事先知道。 .如果您不想让 pandas 读取 int,则需要事先获得此信息。列为 object数据类型。并且可以说,如果您要通过一次传递来获取此信息,为什么不在只读后转换列。无论哪种方式,您都必须通过一次或需要知道所有列号将包含什么data type。 .

关于python - Pandas 从具有未知列名的给定数据类型的 csv 中读取列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72947762/

相关文章:

python - 使用Lambda函数进行分组和聚合

python - 如何在 Numpy 中就地扩展数组?

python - 使用 Flask 作为通过代理进行文件上传?

python - 如何聚合盘中时间戳并在 Pandas 数据框 Python 中创建新列

python - 使用 "browse"按钮在 Tkinter 中显示文件路径 - Python

excel - 使用 INDEX MATCH 查找绝对最接近值

c - 如何使用纯C读取excel文件?

excel - WorksheetFunction.countif 标准不起作用

python - Pandas DataFrame 使用日期和计数进行透视

python - 无法将 DataFrame 保存到 HDF5 ("object header message is too large")