如何根据其他列的内容 select 数据框中的特定数据?
How do I select the specific data in a data frame based on thee contents of other columns?
我是 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 |
等等。我正在寻找一种方法来绘制这些价格与时间的关系(我已将 month/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 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 根据其他列的内容拆分它们?
干杯!
我不敢猜测,但看起来您可能正在遍历行(您说您正在使用 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 的新手,我目前正在尝试使用 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 |
等等。我正在寻找一种方法来绘制这些价格与时间的关系(我已将 month/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 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 根据其他列的内容拆分它们?
干杯!
我不敢猜测,但看起来您可能正在遍历行(您说您正在使用 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)