Pandas reading csv as string type

前端 未结 4 936
暖寄归人
暖寄归人 2020-11-30 03:00

I have a data frame with alpha-numeric keys which I want to save as a csv and read back later. For various reasons I need to explicitly read this key column as a string form

相关标签:
4条回答
  • 2020-11-30 03:31

    Many of the above answers are fine but neither very elegant nor universal. If you want to read all of the columns as strings you can use the following construct without caring about the number of the columns.

    from collections import defaultdict
    import pandas as pd
    
    pd.read_csv(file_or_buffer, converters=defaultdict(lambda i: str))
    

    The defaultdict will return str for every index passed into converters.

    0 讨论(0)
  • 2020-11-30 03:39

    Like Anton T said in his comment, pandas will randomly turn object types into float types using its type sniffer, even you pass dtype=object, dtype=str, or dtype=np.str.

    Since you can pass a dictionary of functions where the key is a column index and the value is a converter function, you can do something like this (e.g. for 100 columns).

    pd.read_csv('some_file.csv', converters={i: str for i in range(0, 100)})
    

    You can even pass range(0, N) for N much larger than the number of columns if you don't know how many columns you will read.

    0 讨论(0)
  • 2020-11-30 03:48

    Update: this has been fixed: from 0.11.1 you passing str/np.str will be equivalent to using object.

    Use the object dtype:

    In [11]: pd.read_csv('a', dtype=object, index_col=0)
    Out[11]:
                          A                     B
    1A  0.35633069074776547     0.745585398803751
    1B  0.20037376323337375  0.013921830784260236
    

    or better yet, just don't specify a dtype:

    In [12]: pd.read_csv('a', index_col=0)
    Out[12]:
               A         B
    1A  0.356331  0.745585
    1B  0.200374  0.013922
    

    but bypassing the type sniffer and truly returning only strings requires a hacky use of converters:

    In [13]: pd.read_csv('a', converters={i: str for i in range(100)})
    Out[13]:
                          A                     B
    1A  0.35633069074776547     0.745585398803751
    1B  0.20037376323337375  0.013921830784260236
    

    where 100 is some number equal or greater than your total number of columns.

    It's best to avoid the str dtype, see for example here.

    0 讨论(0)
  • 2020-11-30 03:48

    Use a converter that applies to any column if you don't know the columns before hand:

    import pandas as pd
    
    class StringConverter(dict):
        def __contains__(self, item):
            return True
    
        def __getitem__(self, item):
            return str
    
        def get(self, default=None):
            return str
    
    pd.read_csv(file_or_buffer, converters=StringConverter())
    
    0 讨论(0)
提交回复
热议问题