在构建庞大的数据帧块时,我对Pandas的性能感到困惑.在Numpy中,我们(几乎)总是通过预先分配一个大的空数组然后填充值来看到更好的性能.据我所知,这是因为Numpy立刻抓住了所需的所有内存,而不必为每次append操作重新分配内存.
在Pandas中,我似乎通过使用df = df.append(temp)模式获得了更好的性能.
这是一个时间示例.Timer该类的定义如下.正如您所见,我发现预分配比使用速度慢大约10倍append!使用np.empty适当的dtype值预分配数据帧有很大帮助,但该append方法仍然是最快的.
import numpy as np
from numpy.random import rand
import pandas as pd
from timer import Timer
# Some constants
num_dfs = 10 # Number of random dataframes to generate
n_rows = 2500
n_cols = 40
n_reps = 100 # Number of repetitions for timing
# Generate a list of num_dfs dataframes of random values
df_list = [pd.DataFrame(rand(n_rows*n_cols).reshape((n_rows, n_cols)), columns=np.arange(n_cols)) for i in np.arange(num_dfs)] …Run Code Online (Sandbox Code Playgroud) 假设我有两个数据帧d1和d2
d1 = pd.DataFrame(np.ones((3, 3), dtype=int), list('abc'), [0, 1, 2])
d2 = pd.DataFrame(np.zeros((3, 2), dtype=int), list('abc'), [3, 4])
Run Code Online (Sandbox Code Playgroud)
d1
0 1 2
a 1 1 1
b 1 1 1
c 1 1 1
Run Code Online (Sandbox Code Playgroud)
d2
3 4
a 0 0
b 0 0
c 0 0
Run Code Online (Sandbox Code Playgroud)
交织两个数据帧列的简单和通用方法是什么.我们可以假设列数d2总是比列数少一个d1.并且,指数是相同的.
我要这个:
pd.concat([d1[0], d2[3], d1[1], d2[4], d1[2]], axis=1)
0 3 1 4 2
a 1 0 1 0 1
b 1 0 1 0 1
c 1 …Run Code Online (Sandbox Code Playgroud) 我有两个 Pandas 数据框,如下所示(此处给出的示例代码)。
\n\n A B C D\n2000-01-01 0.298399 -0.738440 -0.505438 0.324951\n2000-01-02 1.300686 -0.938543 -1.850977 0.868467\nRun Code Online (Sandbox Code Playgroud)\n\n和
\n\n A B C D\n2000-01-03 0.328032 0.325845 -0.289175 0.393732\n2000-01-04 0.091853 -1.450642 -0.544152 1.073248\nRun Code Online (Sandbox Code Playgroud)\n\n我希望zip他们能够处理他们的价值观。为了澄清一下,我试图通过将相应的行压缩在一起来一次获取两行 \xe2\x80\x94 。我不想创建一个新的 df 除非这样会更有效。
我做了我想到的第一件事,即
\n\nfor i, (x, y) in enumerate(zip(df1, df2)):\n print(i, x, y)\nRun Code Online (Sandbox Code Playgroud)\n\n并期望得到类似的东西:
\n\n0 (0.298399 -0.738440 -0.505438 0.324951) (0.328032 0.325845 -0.289175 0.393732)\n1 (1.300686 -0.938543 -1.850977 0.868467) (0.091853 -1.450642 -0.544152 1.073248)\nRun Code Online (Sandbox Code Playgroud)\n\n但我得到的是:
\n\n0 A …Run Code Online (Sandbox Code Playgroud)