THN*_*THN 7 python mysql indexing performance pandas
在关系数据库中,我们可以在列上创建索引,以加快查询和加入这些列.我想在pandas数据帧上做同样的事情.行索引似乎不是关系数据库提供的.
问题是:pandas中的列是否被索引以进行默认搜索?
如果没有,是否可以手动索引列以及如何进行索引?
编辑:我已经阅读过pandas文档并在各处搜索,但没有人提到索引和搜索/合并大熊猫的表现.虽然它在关系数据库中很重要,但似乎没有人关心这个问题.任何人都可以在熊猫上做出关于索引和性能的陈述吗?
谢谢.
正如 @pvg 所提到的 - pandas 模型不是内存关系数据库的模型。因此,如果我们尝试用 sql 和它的特性来类比 pandas,那对我们没有多大帮助。相反,让我们从根本上看问题 - 您正在有效地尝试加速列查找/连接。
\n\n您可以通过将要连接的列设置为两个数据帧(您要连接的左数据帧和右数据帧)中的索引,然后对两个索引进行排序,来显着加快连接速度。
\n\n下面的示例向您展示了加入排序索引时可以获得的加速效果:
\n\nimport pandas as pd\nfrom numpy.random import randint\n\n# Creating DATAFRAME #1\ncolumns1 = ['column_1', 'column_2']\nrows_df_1 = []\n\n# generate 500 rows\n# each element is a number between 0 and 100\nfor i in range(0,500):\n row = [randint(0,100) for x in range(0, 2)]\n rows_df_1.append(row)\n\ndf1 = pd.DataFrame(rows_df_1)\ndf1.columns = columns1\n\nprint(df1.head())\nRun Code Online (Sandbox Code Playgroud)\n\n第一个数据框如下所示:
\n\nOut[]: \n\ncolumn_1 column_2\n0 83 66\n1 91 12\n2 49 0\n3 26 75\n4 84 60\nRun Code Online (Sandbox Code Playgroud)\n\n让我们创建第二个数据框:
\n\ncolumns2 = ['column_3', 'column_4']\nrows_df_2 = []\n# generate 500 rows\n# each element is a number between 0 and 100\nfor i in range(0,500):\n row = [randint(0,100) for x in range(0, 2)]\n rows_df_2.append(row)\n\ndf2 = pd.DataFrame(rows_df_1)\ndf2.columns = columns2\nRun Code Online (Sandbox Code Playgroud)\n\n第二个数据框如下所示:
\n\nOut[]: \n\n column_3 column_4\n0 19 26\n1 78 44\n2 44 43\n3 95 47\n4 48 59\nRun Code Online (Sandbox Code Playgroud)\n\n现在假设您希望将这两个数据框加入column_1 == column_3
# setting the join columns as indexes for each dataframe\ndf1 = df1.set_index('column_1')\ndf2 = df2.set_index('column_3')\n\n\n# joining\n%time\ndf1.join(df2)\n\nOut[]:\nCPU times: user 4 ms, sys: 0 ns, total: 4 ms\nWall time: 46 ms\nRun Code Online (Sandbox Code Playgroud)\n\n正如您所看到的,仅将连接列设置为数据帧索引并在之后连接大约需要 46 毫秒。现在,让我们尝试加入*对索引进行排序后*
\n\n# sorting indexes\ndf1 = df1.sort_index()\ndf2 = df2.sort_index()\n\nOut[]:\n\nCPU times: user 0 ns, sys: 0 ns, total: 0 ns\nWall time: 9.78 \xc2\xb5s\nRun Code Online (Sandbox Code Playgroud)\n\n这大约需要 9.78 \xc2\xb5s,快得多。
\n\n我相信您可以将相同的排序技术应用于 pandas 列 - 按字典顺序对列进行排序并修改数据框。我还没有测试下面的代码,但是类似这样的代码应该可以加快列查找的速度:
\n\nimport numpy as np\n# Lets assume df is a dataframe with thousands of columns\ndf = read_csv('csv_file.csv')\ncolumns = np.sort(df.columns)\n\ndf = df[columns]\nRun Code Online (Sandbox Code Playgroud)\n\n现在列查找应该更快 - 如果有人可以在具有一千列的数据帧上测试它,那就太好了
\n| 归档时间: |
|
| 查看次数: |
1701 次 |
| 最近记录: |