考虑到列中的混合数据类型,如何在Pandas中加载具有适当数据类型的CSV文件?

4szc88ey  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(93)

具体来说,如果一个值用引号括起来(例如,'123'),它应该被视为字符串;如果没有引号(例如,123),它应该被视为数字格式。

import pandas as pd

# Creating a DataFrame with mixed data types
data = {'columns': [1, 2, 3, '4', '5', '6']}
df = pd.DataFrame.from_dict(data)

# Checking unique data types before saving to CSV
selected_column = 'columns'
unique_types_before = {selected_column: set(df[selected_column].apply(type))}
print(unique_types_before)  # Output: {'columns': {<class 'int'>, <class 'str'>}}

# Saving DataFrame to CSV
df.to_csv('example.csv')

# Loading DataFrame from the saved CSV file
dataframe = pd.read_csv('example.csv')

# Checking unique data types after loading from CSV
unique_types_after = {selected_column: set(dataframe[selected_column].apply(type))}
print(unique_types_after)  # Output: {'columns': {<class 'int'>}}

字符串
我遇到了一个问题,即在保存到CSV文件时,DataFrame中的数据类型没有正确保留。经过调查,我手动创建了一个名为“manual_example.csv”的CSV文件,其中包含以下内容:

columns
1
2
3
4
5
6
"7"


为了解决这个问题,我正在寻找如何将“manual_example.csv”加载到DataFrame中的指导,同时确保行中的数据类型得到正确解释。目标是将引号中的值(例如,“123”)视为字符串,而将没有引号的值(例如,123)视为数值格式。
以下是我到目前为止使用的代码:

import pandas as pd
from io import StringIO

# Replace 'example.csv' with the actual path to your CSV file
csv_file_path = 'manual_example.csv'

# Read the content of the CSV file
with open(csv_file_path, 'r', encoding='utf-8') as file:
    csv_content = file.read()

# Use StringIO to create a file-like object
csv_file = StringIO(csv_content)

# Read CSV with appropriate data types
df1 = pd.read_csv(csv_file, quotechar='"', dtype={'columns': object})
unique_types_df1 = {selected_column: set(df1[selected_column].apply(type))}
print(unique_types_df1)  # Output: {'columns': {<class 'str'>}}


我很感激任何关于如何在CSV文件加载过程中正确处理数据类型的见解或建议。

l3zydbqr

l3zydbqr1#

pandas将在阅读csv文件时剥离",因为这是正确取消转义文本所必需的(想想""5" was all he said!")。你可以使用converters-(而不是dtypes)参数来手动将CSV文本转换为各种对象,但您需要禁用报价处理,如果CSV文件的格式包含必须被引用的文本,则这可能导致问题。

import csv

# ...

def converter(obj: str):
    if obj.startswith('"') and obj.endswith('"'):
        # `"7"` is processed like `str(7)`
        return obj[1:-1]
    # everything else better be a int
    return int(obj)

df1 = pd.read_csv(csv_file, quoting=csv.QUOTE_NONE, converters={'columns': converter})

字符串

相关问题