如何从pandas df快速读取和绘制数组

时间:2016-06-26 18:04:56

标签: python sql arrays pandas matplotlib

我在pandas中有以下数据框,其中包含使用pd.read_sql()直接从sqlite db读取数据的数组:

      ArrayID  Value
 0        0      0
 1        0      1
 2        0      2
 3        0      3
 4        0      4
 5        0      5
 6        1      0
 7        1      1
 8        1      2
 9        1      3

我想知道快速获取数组的方法,以便我可以绘制它:

Array0 [0,1,2,3,4,5]

Array1 [0,1,2,3]

我能想到的唯一方法是(当表有1000个数组,数组长度不一,maxixum长度为500时)真的很慢:

import pandas as pd    
import matplotlib.pyplot as plt

# loop on
for id in df.ArrayID:
    array = df.loc[df["ArrayID"]==id, "Value"].values()
    plt.plot(array)

plt.show()

或者是matplotlib是什么问题?

1 个答案:

答案 0 :(得分:1)

使用groupby在一次通话中获取群组(而不是多次拨打df.locdf['ArrayID'] == id):

for aid, grp in df.groupby(['ArrayID']):
    plt.plot(grp['Value'].values) 

另请注意plt.plot不是很快。调用1000次可能会觉得很慢。此外,1000行的情节可能看起来不太容易理解。您可能需要重新考虑您希望可视化的数量(可能通过聚类或聚合)。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

N, M = 500, 1000
data = np.row_stack([np.column_stack(np.broadcast_arrays(i, 
    (np.random.random(np.random.randint(N))-0.5).cumsum())) for i in range(M)])
df = pd.DataFrame(data, columns=['ArrayID', 'Value'])
for aid, grp in df.groupby(['ArrayID']):
    plt.plot(grp['Value'].values) 
plt.show()

enter image description here