[英]Pandas column indexing for searching?
在關系數據庫中,我們可以在列上創建索引,以加快查詢和加入這些列。 我想在pandas數據幀上做同樣的事情。 行索引似乎不是關系數據庫提供的。
問題是:pandas中的列是否為默認搜索索引?
如果沒有,是否可以手動索引列以及如何進行索引?
編輯:我已經閱讀過pandas文檔並在各處搜索,但沒有人提到索引和搜索/合並大熊貓的表現。 雖然它在關系數據庫中很重要,但似乎沒有人關心這個問題。 任何人都可以在熊貓上做出關於索引和性能的陳述嗎?
謝謝。
如@pvg所述 - 熊貓模型不是內存關系數據庫的模型。 所以,如果我們嘗試用sql和它的特性來模擬大熊貓,它對我們沒什么幫助。 相反,讓我們從根本上看問題 - 你正在有效地嘗試加速列查找/連接。
通過將要加入的列設置為兩個數據框 (您希望加入的左右數據框)中的索引 ,然后對兩個索引進行排序,可以大大加快連接速度。
這是一個示例,向您展示加入已排序索引時可以獲得的加速類型:
import pandas as pd
from numpy.random import randint
# Creating DATAFRAME #1
columns1 = ['column_1', 'column_2']
rows_df_1 = []
# generate 500 rows
# each element is a number between 0 and 100
for i in range(0,500):
row = [randint(0,100) for x in range(0, 2)]
rows_df_1.append(row)
df1 = pd.DataFrame(rows_df_1)
df1.columns = columns1
print(df1.head())
第一個數據框如下所示:
Out[]:
column_1 column_2
0 83 66
1 91 12
2 49 0
3 26 75
4 84 60
讓我們創建第二個數據幀:
columns2 = ['column_3', 'column_4']
rows_df_2 = []
# generate 500 rows
# each element is a number between 0 and 100
for i in range(0,500):
row = [randint(0,100) for x in range(0, 2)]
rows_df_2.append(row)
df2 = pd.DataFrame(rows_df_1)
df2.columns = columns2
第二個數據框如下所示:
Out[]:
column_3 column_4
0 19 26
1 78 44
2 44 43
3 95 47
4 48 59
現在假設您希望在column_1 == column_3
上加入這兩個數據幀
# setting the join columns as indexes for each dataframe
df1 = df1.set_index('column_1')
df2 = df2.set_index('column_3')
# joining
%time
df1.join(df2)
Out[]:
CPU times: user 4 ms, sys: 0 ns, total: 4 ms
Wall time: 46 ms
如您所見,只需將連接列設置為數據幀索引並在之后加入 - 大約需要46毫秒。 現在,讓我們在排序索引后嘗試加入*
# sorting indexes
df1 = df1.sort_index()
df2 = df2.sort_index()
Out[]:
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 9.78 µs
這大約需要9.78μs,速度要快得多。
我相信你可以對pandas列應用相同的排序技術 - 按字典順序對列進行排序並修改數據幀。 我沒有測試下面的代碼,但是這樣的事情可以讓你加速列查找:
import numpy as np
# Lets assume df is a dataframe with thousands of columns
df = read_csv('csv_file.csv')
columns = np.sort(df.columns)
df = df[columns]
現在列查找應該更快 - 如果有人可以在具有數千列的數據幀上測試它,那將是很好的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.