首页 > 解决方案 > 如何:Pandas 按 A、B 分组并将 A 组与 B 组的每一行绘制在一个图中

问题描述

我试图用 pandas 找出一条出路,在那里我可以绘制我的数据。首先我想按类别对它们进行分组,然后我想按模型对它们进行分组。在我的表中,我记录了每天的价格(时间戳)。

我想比较的是,模型的价格如何随时间变化,但在每个类别中。

所以我想要一个汽车、自行车等的数字,我只绘制相关的价格线

示例表

#  Timestamp    Category    Model     Price
1  2020-05-01   Cars        BMW M1    12000€
2  2020-05-01   Cars        Audi A8   43000€
3  2020-05-01   Bikes       Benelli   5000€
3  2020-05-01   Bikes       Honda     9000€

目前,我这样做:

df.groupby(['Category', 'Model' ]).plot(x = "Timestamp", y = "Price")

但这为每个模型绘制了一个单独的图形。

有人可以指出我正确的方向吗?

[已编辑]

我试着做一个 python 例子,所以你们可以得到数据。在这个例子中,我们有股票价格和市场类别。

基本上,我想在一个图中绘制每个 Q 类公司的股票价格,在另一个图中绘制 O 类公司的股票价格。如果有更多类别,请在其他图中绘制公司。

这样,您可以将同一类别的一家公司相互比较

import pandas as pd
# import matplotlib.pyplot as plt
# import seaborn as sns
# import numpy as np
# import plotly 
# import cufflinks as cf
import datetime
import yfinance as yf
# import time
import requests
import io

# cf.go_offline()

url="https://pkgstore.datahub.io/core/nasdaq-listings/nasdaq-listed_csv/data/7665719fb51081ba0bd834fde71ce822/nasdaq-listed_csv.csv"

s = requests.get(url).content
companies = pd.read_csv(io.StringIO(s.decode('utf-8')))[:5]

Symbols = companies['Symbol'].tolist()
Category = companies['Market Category'].tolist()
display(Symbols)
gr=  companies.groupby('Market Category')


stock_final = pd.DataFrame()
# iterate over each symbol
start = datetime.datetime(2020,9,1)
end = datetime.datetime(2020,11,1)

for i in Symbols:  
    # print the symbol which is being downloaded
    print( str(Symbols.index(i)) + str(' : ') + i, sep=',', end=',', flush=True)  
    index = Symbols.index(i)
    try:
        # download the stock price 
        stock = []
        stock = yf.download(i,start=start, end=end, progress=False)
        
        # append the individual stock prices 
        if len(stock) == 0:
            None
        else:
            stock['Name']=i
            stock['Market Category'] = Category[index]
            stock_final = stock_final.append(stock,sort=False)
    except Exception:
        None

groups = stock_final.groupby(['Market Category', 'Name'])
groups.head()

解决方案

我最终在两个 for 循环中完成了它:

for name, group in  df.groupby(['Market Category']):
    fig, ax = plt.subplots()

    for key, grp in group.groupby('Name'):
        ax = grp.plot(ax=ax, kind='line', x='timestamp', y='price', label=key)
    
    plt.title(name)
    plt.legend(loc='best')
    plt.show()

标签: pythonmatplotlibpandas-groupbymultiline

解决方案


推荐阅读