【问题标题】:How do I select the specific data in a data frame based on thee contents of other columns?如何根据其他列的内容选择数据框中的特定数据?
【发布时间】:2019-12-02 20:26:32
【问题描述】:

我是 pandas 的新手,我目前正在尝试在我的平板电脑上使用 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"][..., etc. 来过滤每个国家、地区、市场和项目的数据,但所有这些都特别慢。数据集相当大(大约 12000 x 12),所以我不希望立即得到结果,但有什么明显的我遗漏了吗?还是我应该等到我的笔记本电脑拿回来?

编辑:为了尝试提供更多背景信息,我试图获取多年来和几个月的价格,以绘制价格如何波动的图。我想根据国家、地区、市场和项目来区分它们,所以绘制的每条线都将是一个国家地区的市场中的不同项目。到目前为止,我有以下代码:

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 根据其他列的内容进行拆分?

干杯!

【问题讨论】:

  • 您是否尝试过使用pandas.read_csv
  • 欢迎堆栈溢出!不幸的是,你的问题不清楚。标题询问如何解析 csv,但问题的文本表明它已经在数据框中解析,并且您正在尝试对其进行操作。请edit 澄清您希望实际输出的样子。根据您的描述,我您想要带有df.groupby(['Country','Region',...])....plot() 的东西,但很难说
  • 问题标题似乎与描述中提到的问题不匹配(或者我有什么问题吗?)。另外,当您说按时间绘制这些价格时,您的意思是每个项目标签,每个市场,每个国家/地区的区域?或者分组应该走多远?您是否有理想解决方案的示例输出? (不管是硬编码还是其他)
  • 抱歉,我已尝试修正标题。我已经用我写的代码更新了这个问题。我想为每个国家、地区、市场和项目相互绘制价格和时间数据,但我的 for 循环很慢。我尝试过的所有其他方法都不起作用,这是唯一接近的方法(我假设,因为运行需要很长时间,以至于在取消之前我从来没有让它绘制)。

标签: python pandas qpython


【解决方案1】:

我不敢猜测,但您似乎正在遍历行(您说您使用的是iloc)。这是 pandas 中最慢的操作。 Pandas 数据帧针对系列访问进行了优化。

如果您的绘图可以直接将 matplotlib 与 pandas 数据框一起使用,并使用 groupby 方法组合数据,而无需遍历数据框的行。

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

【讨论】:

  • 感谢您的回答。我已尝试编辑并解决我的问题。
【解决方案2】:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2016-08-04
    相关资源
    最近更新 更多