有一件事我发现自己必须经常这样做,令我惊讶的是,在熊猫中实现这一目标是多么困难.假设我需要DataFrame
使用指定的索引类型和名称以及列类型和名称创建一个空.(我可能想稍后在循环中填充它.例如.)我发现,最简单的方法是pandas.Series
为每个列创建一个空对象,指定它们的dtype
s,将它们放入一个字典中,指定它们名称,并将字典传递给DataFrame
构造函数.像下面这样的东西.
def create_empty_dataframe():
index = pandas.Index([], name="id", dtype=int)
column_names = ["name", "score", "height", "weight"]
series = [pandas.Series(dtype=str), pandas.Series(dtype=int), pandas.Series(dtype=float), pandas.Series(dtype=float)]
columns = dict(zip(column_names, series))
return pandas.DataFrame(columns, index=index, columns=column_names)
# The columns=column_names is required because the dictionary will in general put the columns in arbitrary order.
Run Code Online (Sandbox Code Playgroud)
第一个问题.上面真的是最简单的方法吗?关于这一点有很多令人费解的事情.我真正想做的事情,以及我很确定很多人真正想要做的事情,就像下面这样.
df = pandas.DataFrame(columns=["id", "name", "score", "height", "weight"], dtypes=[int, str, int, float, float], index_column="id")
Run Code Online (Sandbox Code Playgroud)
第二个问题.在熊猫中这种语法是否可行?如果不是,开发人员是否考虑支持这样的事情?我觉得它真的应该像这样简单(上面的语法).
我在python字典中有数据,如:
data = {u'01-01-2017 22:34:43:871': [u'88.49197', u'valid'],
u'01-01-2017 11:23:43:803': [u'88.49486', u'valid'],
u'02-01-2017 03:11:43:898': [u'88.49773', u'valid'],
u'01-01-2017 13:54:43:819': [u'88.50205', u'valid']}
Run Code Online (Sandbox Code Playgroud)
我可以将它转换为pandas Dataframe:
data = pandas.DataFrame.from_dict(data, orient='index')
Run Code Online (Sandbox Code Playgroud)
但是我无法使用dtype参数from_dict
.我会将索引转换datetime
为类似的第一列浮点数,第三列转换为字符串.
我试过了:
pandas.DataFrame.from_dict((data.values()[0]), orient='index',
dtype={0: 'float', 1:'str'})
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
假设我有一个数据框,并且想将数据类型设置为所有列,就像我调用read_csv
方法一样。为了简单起见,同样的错误TypeError: object of type 'type' has no len()
给出了这段代码:
df = pd.DataFrame([1,2,2,3], columns = ['num'], dtype={'num':int})
Run Code Online (Sandbox Code Playgroud)
这里出了什么问题以及如何让它发挥作用?
完整的错误堆栈:
TypeError Traceback (most recent call last)
<ipython-input-42-e8a84bf74364> in <module>()
----> 1 df = pd.DataFrame([1,2,2,3], columns = ['num'], dtype={'num':int})
C:\Anaconda3\lib\site-packages\pandas\core\frame.py in __init__(self, data, index, columns, dtype, copy)
264 data = {}
265 if dtype is not None:
--> 266 dtype = self._validate_dtype(dtype)
267
268 if isinstance(data, DataFrame):
C:\Anaconda3\lib\site-packages\pandas\core\generic.py in _validate_dtype(self, dtype)
145
146 if dtype is not None:
--> 147 …
Run Code Online (Sandbox Code Playgroud)