Python 如何根据其他列的内容选择数据框中的特定数据?

Python 如何根据其他列的内容选择数据框中的特定数据?,python,pandas,qpython,Python,Pandas,Qpython,我是熊猫队的新手,目前我正尝试使用qPython(临时情况,笔记本电脑正在修复)在平板电脑上的数据集上使用它。我有一个csv文件,其中包含一组按国家、地区、市场和商品标签组织的数据,还包括其他列“价格”、“年份”和“月份”。这些规定如下所示: Country | Region | Market | Item Label | ... | Price | Year | Month | Canada | Quebec | Market No. | Item Name | ... | $$

我是熊猫队的新手,目前我正尝试使用qPython(临时情况,笔记本电脑正在修复)在平板电脑上的数据集上使用它。我有一个csv文件,其中包含一组按国家、地区、市场和商品标签组织的数据,还包括其他列“价格”、“年份”和“月份”。这些规定如下所示:

Country | Region |   Market   | Item Label | ... | Price | Year | Month |
Canada  | Quebec | Market No. | Item Name  | ... |  $$$  | 2002 |   1   |
Canada  | Quebec | Market No. | Item Name  | ... |  $$$  | 2002 |   2   |
Canada  | Quebec | Market No. | Item Name  | ... |  $$$  | 2002 |   3   |
Canada  | Quebec | Market No. | Item Name  | ... |  $$$  | 2002 |   4   |
等等。我正在寻找一种根据时间绘制这些价格的方法(我已经将月份/12添加到年份中,以有效地合并最后的列)

最初,我有一个代码来获取csv数据并将其放入字典中,如下所示:

{Country_Name: {Region_Name: {Market_Name: {Item_Name: {"Price": price_list, "Time": time_list}}}}}
用于在键上循环以访问每个价格和时间列表

然而,我很难使用pandas获得类似的结果:我尝试了很多不同的方法,例如iloc、data[data.Country==“Canada”][data.Region==“Quebec”][……,来过滤每个国家、地区、市场和项目的数据,但所有这些方法都特别慢。数据集相当大(大约12000到12个),所以我不希望立即得到结果,但我是否有明显的遗漏?或者我应该等到我的笔记本电脑回来吗

编辑:为了尝试提供更多的上下文,我试图获得几年和几个月的价格,以绘制价格如何波动。我想根据国家、地区、市场和项目lael将它们分开,因此绘制的每一行将是一个国家中某个地区某个市场中的不同项目。到目前为止,我有以下代码:

def abs_join_paths(*args):
    return os.path.abspath(os.path.join(*args))

def get_csv_data_frame(*path, memory = True):
    return pandas.read_csv(abs_join_paths(*path[:-1], path[-1] + ".csv"), low_memory = memory)

def get_food_data(*path):
    food_price_data = get_csv_data_frame(*path, memory = False)
    return food_price_data[food_price_data.cm_name != "Fuel (diesel) - Retail"]

food_data = get_food_data(data_path, food_price_file_name)

def plot_food_price_time_data(data, title, ylabel, xlabel, plot_style = 'k-'):
    plt.clf()
    plt.hold(True)
    data["mp_year"] += data["mp_month"]/12
    for country in data["adm0_name"].unique():
        for region in data[data.adm0_name == country]["adm1_name"].unique():
            for market in data[data.adm0_name == country][data.adm1_name == region]["mkt_name"]:
                for item_label in data[data.adm0_name == country][data.adm1_name == region][data.mkt_name == market]["cm_name"]:
                    current_data = data[data.adm0_name == country][data.adm1_name == region][data.mkt_name == market][data.cm_name == item_label]
                    #year = list(current_data["mp_year"])
                    #month = list(current_data["mp_month"])
                    #time = [float(y) + float(m)/12 for y, m in zip(year, month)]
                    plt.plot(list(current_data["mp_year"]), list(current_data["mp_price"]), plot_style)
                    print(list(current_data["mp_price"]))
    plt.savefig(abs_join_paths(imagepath, title + ".png"))
Edit2/tl;dr:我有一系列的价格和时间,一个接一个地列在一个长长的列表中。我如何使用pandas根据其他列的内容来划分它们


干杯!

我不敢猜,但看起来您可能正在遍历行(您说您使用的是
iloc
)。这是pandas中最慢的操作。pandas数据帧针对串行访问进行了优化

如果打印,则可以直接将matplotlib与pandas数据框一起使用,并使用
groupby
方法组合数据,而无需迭代数据框的行


如果没有更多信息,很难具体回答您的问题。请查看您问题的评论。

groupby函数完成了以下操作:

def plot_food_price_time_data(data, title, ylabel, xlabel, plot_style = 'k-'):
    plt.clf()
    plt.hold(True)
    group_data = data.groupby(["adm0_name", "adm1_name", "mkt_name", "cm_name"])
    for i in range(len(data)):
        print(data.iloc[i, [1, 3, 5, 7]])
        specific_data = group_data.get_group(tuple(data.iloc[i, [1, 3, 5, 7]]))
        plt.plot(specific_data["mp_price"], specific_data["mp_year"] + specific_data["mp_month"]/12)

您是否尝试过使用pandas.read_csv?欢迎使用stack overflow!不幸的是,您的问题不清楚。标题询问如何解析csv,但问题文本表明它已在数据帧中解析,您正在尝试对其进行操作。请澄清您希望实际输出是什么样子。根据您的描述,我猜您想要的东西带有
df.groupby(['Country','Region',…])…
.plot()
,但很难说问题标题似乎与描述中所述的问题不匹配(或者我有什么错吗?)。此外,当你说根据时间绘制这些价格时,你指的是每个项目标签、每个市场、每个国家的地区?或者分组应该走多远?你有理想解决方案的示例输出吗?(不管是硬编码还是其他)抱歉,我已尝试修复标题。我已使用我编写的代码更新了问题。我希望每个国家、地区、市场和商品的价格和时间数据相互对应,但我的for循环速度很慢。我尝试的其他方法均无效,这是唯一接近的方法(我想,因为它需要很长时间才能运行,所以在取消之前我从未让它进行绘图)。谢谢你的回答。我已经尝试编辑并解决了我的问题。