python - 设置 pandas.DataFrame 字符串 dtype (不是基于文件)

标签 python pandas numpy

我在使用 pandas.DataFrame 的构造函数和使用 dtype 参数时遇到问题。我想保留字符串值,但以下代码片段始终转换为数字类型,然后生成 NaNs。

from __future__ import unicode_literals
from __future__ import print_function


import numpy as np
import pandas as pd


def main():
    columns = ['great', 'good', 'average', 'bad', 'horrible']
    # minimal example, dates are coming (as strings) from some
    # non-file source.
    example_data = {
        'alice': ['', '', '', '2016-05-24', ''],
        'bob': ['', '2015-01-02', '', '', '2012-09-15'],
        'eve': ['2011-12-31', '', '1998-08-13', '', ''],
    }

    # first pass, yields dataframe full of NaNs
    df = pd.DataFrame(data=example_data, index=example_data.keys(),
        columns=columns, dtype=str) #or string, 'str', 'string', 'object'
    print(df.dtypes)
    print(df)
    print()

    # based on https://github.com/pydata/pandas/blob/master/pandas/core/frame.py
    # and https://github.com/pydata/pandas/blob/37f95cef85834207db0930e863341efb285e38a2/pandas/types/common.py
    # we're ultimately feeding dtype to numpy's dtype, so let's just use that:
    #     (using np.dtype('S10') and converting to str doesn't work either)
    df = pd.DataFrame(data=example_data, index=example_data.keys(),
        columns=columns, dtype=np.dtype('U'))
    print(df.dtypes)
    print(df) # still full of NaNs... =(



if __name__ == '__main__':
    main()

dtypes 的哪些值将保留数据框中的字符串?

供引用:

$ python --version

2.7.12

$ pip2 list | grep pandas

pandas (0.18.1)

$ pip2 list | grep numpy

numpy (1.11.1)

最佳答案

对于OP中的特殊情况,您可以使用DataFrame.from_dict() constructor (另请参阅 DataFrame 文档的 Alternate Constructors 部分)。

from __future__ import unicode_literals
from __future__ import print_function

import pandas as pd

columns = ['great', 'good', 'average', 'bad', 'horrible']
example_data = {
    'alice': ['', '', '', '2016-05-24', ''],
    'bob': ['', '2015-01-02', '', '', '2012-09-15'],
    'eve': ['2011-12-31', '', '1998-08-13', '', ''],
}
df = pd.DataFrame.from_dict(example_data, orient='index')
df.columns = columns

print(df.dtypes)
# great       object
# good        object
# average     object
# bad         object
# horrible    object
# dtype: object

print(df)
#             great        good     average         bad    horrible
# bob                2015-01-02                          2012-09-15
# eve    2011-12-31              1998-08-13                        
# alice                                      2016-05-24     

您甚至可以在 DataFrame.from_dict() 中指定 dtype=str - 尽管在此示例中不是必需的。

编辑:DataFrame 构造函数将字典解释为列的集合:

print(pd.DataFrame(example_data))

#         alice         bob         eve
# 0                          2011-12-31
# 1              2015-01-02            
# 2                          1998-08-13
# 3  2016-05-24                        
# 4              2012-09-15            

(我将删除 data=,因为 data 无论如何都是函数签名中的第一个参数)。您的代码混淆了行和列:

print(pd.DataFrame(example_data, index=example_data.keys(), columns=columns))

#       great good average  bad horrible
# alice   NaN  NaN     NaN  NaN      NaN
# bob     NaN  NaN     NaN  NaN      NaN
# eve     NaN  NaN     NaN  NaN      NaN   

(尽管我不太确定它最终如何为您提供 NaN 的 DataFrame)。这样做是正确的

print(pd.DataFrame(example_data, columns=example_data.keys(), index=columns))

#                alice         bob         eve
# great                             2011-12-31
# good                  2015-01-02            
# average                           1998-08-13
# bad       2016-05-24                        
# horrible              2012-09-15   

指定列名实际上是不必要的——它们已经从字典中解析出来了:

print(pd.DataFrame(example_data, index=columns))

#                alice         bob         eve
# great                             2011-12-31
# good                  2015-01-02            
# average                           1998-08-13
# bad       2016-05-24                        
# horrible              2012-09-15                     

你想要的实际上是它的转置 - 所以你也可以采用所说的转置!

print(pd.DataFrame(data=example_data, index=columns).T)

#             great        good     average         bad    horrible
# alice                                      2016-05-24            
# bob                2015-01-02                          2012-09-15
# eve    2011-12-31              1998-08-13               

关于python - 设置 pandas.DataFrame 字符串 dtype (不是基于文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39600816/

相关文章:

python - 如何使用递归方式将二进制转换为十进制?

Python循环错误计数器

python - 如何使用原始值的子字符串更新列值

python - 检测图像中线的起点和终点(numpy 数组)

numpy - numpy 是否自动针对 raspberry-pi 进行了优化

numpy - 使用不同 BLAS 实现的 NumPy 的性能

Python,数据库结果保存为 ('result' )

python - 如何在 OSX 上安装 : Quandl on Anaconda (Python) 3. 4

python - 代码有效,但在方法内部插入时无效

python - IDLE 不会在 python 3.0 中启动