我在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是什么问题?
答案 0 :(得分:1)
使用groupby
在一次通话中获取群组(而不是多次拨打df.loc
和df['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()