我在使用 pandas.DataFrame
的构造函数和使用 dtype
参数时遇到问题。我想保留字符串值,但以下代码片段始终转换为数字类型,然后生成 NaN
s。
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/