【问题标题】:How to read and plot arrays from pandas df fast如何从 pandas df 快速读取和绘制数组
【发布时间】:2016-06-26 18:04:55
【问题描述】:

我在 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 个数组,数组的长度不同,最大长度为 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 有问题?

【问题讨论】:

    标签: python sql arrays pandas matplotlib


    【解决方案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()
    

    【讨论】:

    • 谢谢,它对我的​​任务很有效!我刚刚将 plt.plot(grp["Value"]) 更改为 plt.plot(grp["Value"].values) 所以每个数组的 x 轴总是从 0 开始。您会推荐其他解决方案以在 python 中更快地绘图吗?我知道一个情节的行数太高了。但我想知道是否可以在 python 中更快地绘图。
    • 抱歉,我没有更好的建议,尽管运行上面的代码似乎并没有太慢。
    猜你喜欢
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2021-08-27
    • 2017-06-20
    相关资源
    最近更新 更多