当前位置: 首页 > 知识库问答 >
问题:

创建一个空的熊猫数据帧,然后填充它

李昌勋
2023-03-14

我从熊猫数据帧文档开始:数据结构简介

我想在一个时间序列类型的计算中迭代地填充数据帧。所以基本上,我想用列A、B和时间戳行初始化数据帧,全0或全NaN。

然后,我会添加初始值并检查这些数据,根据之前的行计算新行,比如说< code > row[A][t]= row[A][t-1]1 左右。

我目前正在使用下面的代码,但我觉得它有点难看,必须有一种方法直接用数据帧来做这件事,或者一般来说是一种更好的方法。

注意:我使用的是蟒蛇 2.7。

import datetime as dt
import pandas as pd
import scipy as s

if __name__ == '__main__':
    base = dt.datetime.today().date()
    dates = [ base - dt.timedelta(days=x) for x in range(0,10) ]
    dates.sort()
    
    valdict = {}
    symbols = ['A','B', 'C']
    for symb in symbols:
        valdict[symb] = pd.Series( s.zeros( len(dates)), dates )
        
    for thedate in dates:
        if thedate > dates[0]:
            for symb in valdict:
                valdict[symb][thedate] = 1+valdict[symb][thedate - dt.timedelta(days=1)]
            
    print valdict

共有3个答案

郜杰
2023-03-14

如果您只是想创建一个空数据帧并稍后用一些传入的数据帧填充它,请尝试以下操作:

newDF = pd.DataFrame() #creates a new dataframe that's empty
newDF = newDF.append(oldDF, ignore_index = True) # ignoring index is optional
# try printing some data from newDF
print newDF.head() #again optional 

在这个例子中,我使用这个pandas文档创建一个新的数据帧,然后使用append将来自oldDF的数据写入newDF。

如果我必须继续从多个oldDF向newDF添加新数据,我只需使用for循环遍历pandas.DataFrame.append()

注意:自版本1.4.0起,append()已弃用。请使用concat()

越俊驰
2023-03-14

这里有几个建议:

使用date_range作为索引:

import datetime
import pandas as pd
import numpy as np

todays_date = datetime.datetime.now().date()
index = pd.date_range(todays_date-datetime.timedelta(10), periods=10, freq='D')

columns = ['A','B', 'C']

注意:我们可以简单地通过以下方式创建一个空的DataFrame(使用NaNs):

df_ = pd.DataFrame(index=index, columns=columns)
df_ = df_.fillna(0) # With 0s rather than NaNs

要对数据进行这些类型的计算,请使用NumPy数组:

data = np.array([np.arange(10)]*3).T

因此,我们可以创建DataFrame:

In [10]: df = pd.DataFrame(data, index=index, columns=columns)

In [11]: df
Out[11]:
            A  B  C
2012-11-29  0  0  0
2012-11-30  1  1  1
2012-12-01  2  2  2
2012-12-02  3  3  3
2012-12-03  4  4  4
2012-12-04  5  5  5
2012-12-05  6  6  6
2012-12-06  7  7  7
2012-12-07  8  8  8
2012-12-08  9  9  9
况胡媚
2023-03-14

太长,读不下去了(只需阅读粗体文本)

这里的大多数答案都会告诉你如何创建一个空的DataFrame并填写它,但没有人会告诉你这是一件坏事。

这是我的建议:在列表中积累数据,而不是数据帧。

使用一个列表来收集你的数据,然后在你准备好的时候初始化一个数据框架。列表列表或字典列表格式都可以,< code>pd。DataFrame两者都接受。

data = []
for row in some_function_that_yields_data():
    data.append(row)

df = pd.DataFrame(data)

目录数据帧将行列表(其中每行都是一个标量值)转换为数据帧。如果您的函数改为生成数据帧,请调用 pd.concat

这种方法的优点:

> < li>

一次性追加到列表并创建数据帧总是比创建一个空数据帧(或一个nan)并反复追加到列表中要便宜。

列表也占用较少的内存,并且是一种更轻的数据结构,可以使用,追加和删除(如果需要)。

dtype 是自动推断的(而不是将对象分配给所有 dtype)。

系统会自动为数据创建 RangeIndex,而不必小心为每次迭代时追加的行分配正确的索引。

如果你还不相信,这也在留档中提到:

以迭代方式将行追加到数据帧可能比单个串联的计算量更大。更好的解决方案是将这些行追加到列表中,然后将该列表与原始 DataFrame 同时连接起来。

pandas 1.4开始,append现已被弃用!使用pd。改为concat。请参阅发行说明

这是我从初学者那里看到的最大错误:

df = pd.DataFrame(columns=['A', 'B', 'C'])
for a, b, c in some_function_that_yields_data():
    df = df.append({'A': i, 'B': b, 'C': c}, ignore_index=True) # yuck
    # or similarly,
    # df = pd.concat([df, pd.Series({'A': i, 'B': b, 'C': c})], ignore_index=True)

内存将重新分配给您执行的每个appendconcatoperation。将其与一个循环耦合,您将得到一个二次复杂度运算。

df.append相关的另一个错误是用户倾向于忘记append不是就地函数,因此必须将结果分配回来。您还必须担心dtype:

df = pd.DataFrame(columns=['A', 'B', 'C'])
df = df.append({'A': 1, 'B': 12.3, 'C': 'xyz'}, ignore_index=True)

df.dtypes
A     object   # yuck!
B    float64
C     object
dtype: object

处理对象列从来都不是一件好事,因为熊猫无法向量化这些列上的操作。您需要这样做才能修复它:

df.infer_objects().dtypes
A      int64
B    float64
C     object
dtype: object

我还看到 loc 用于追加到创建为空的数据帧:

df = pd.DataFrame(columns=['A', 'B', 'C'])
for a, b, c in some_function_that_yields_data():
    df.loc[len(df)] = [a, b, c]

和以前一样,你每次都没有预先分配你需要的内存量,所以每次创建新行时内存都会重新增长。就像append一样糟糕,甚至更难看。

然后,创建一个NaNs的数据框架,以及与之相关的所有注意事项。

df = pd.DataFrame(columns=['A', 'B', 'C'], index=range(5))
df
     A    B    C
0  NaN  NaN  NaN
1  NaN  NaN  NaN
2  NaN  NaN  NaN
3  NaN  NaN  NaN
4  NaN  NaN  NaN

它创建一个对象列的DataFrame,就像其他的一样。

df.dtypes
A    object  # you DON'T want this
B    object
C    object
dtype: object

附录仍然存在上述方法的所有问题。

for i, (a, b, c) in enumerate(some_function_that_yields_data()):
    df.iloc[i] = [a, b, c]

计时这些方法是查看它们在内存和实用程序方面有多大差异的最快方法。

基准代码,供参考。

 类似资料:
  • 然后,我会添加初始值,然后查看这个数据,从前面的行计算新行,例如左右。 我目前使用的代码如下所示,但我觉得它有点难看,必须有一种方法直接使用DataFrame来实现这一点,或者只是一种更好的方法。注意:我使用的是Python2.7。

  • 问题内容: 我从这里的pandas DataFrame文档开始:http ://pandas.pydata.org/pandas-docs/stable/dsintro.html 我想在时间序列类型的计算中用值迭代地填充DataFrame。所以基本上,我想用列A,B和时间戳记行(全为0或全部为NaN)初始化DataFrame。 然后,我将添加初始值,然后遍历此数据,计算出大约某行之前的新行row[

  • 我有两个Dataframes一个与日期集(df1)和另一个与emp_ids集(df2)。我试图创建一个新的Dataframe,这样df2中的每个emp_id都被标记为df1中的每个日期。 下面给出了我的数据帧的外观 df1 df2 预期产出: 我将日期列转换为字符串,并尝试执行以下操作,但返回的数据框为空 我尝试做

  • 向对象似乎很难完成。有3个与此相关的stackoverflow问题,没有一个给出有效的答案。 这就是我要做的。我有一个DataFrame,我已经知道它的形状以及行和列的名称。 现在,我有了一个迭代计算行值的函数。我如何用字典或?以下是失败的各种尝试: 显然,它试图添加一列而不是一行。 非常不具信息性的错误消息。 显然,这仅用于在数据框中设置单个值。 我不想忽略索引,否则结果如下: 它确实对齐了列名

  • 我正在尝试制作一个数据帧,以便可以轻松地将其发送到CSV,否则我必须手动执行此过程。。 我希望这是我的最终输出。每个人都有一个月和年的组合,从2014年1月1日开始,一直到2016年1月12日: 到目前为止的代码: 当我尝试循环创建数据帧时,它要么不工作,要么出现索引错误(因为不匹配列表),我不知所措。 我已经做了一点很好的搜索,并找到了以下一些类似的链接,但我不能反向工程的工作,以适应我的情况。

  • 拿着字典: 我如何把这个字典变成一个数据框,其中的值是列?即。我想要一个数据框显示: 这种形式似乎根本得不到! 谢谢 这是一个不同的问题,另一个问题只是问如何将字典的值放入数据帧,我问的是如何获得我概述的特定形式