【发布时间】:2020-04-01 15:15:46
【问题描述】:
我有一个包含商品及其价格的数据框,如下所示:
╔══════╦═════╦═══════╗
║ Item ║ Day ║ Price ║
╠══════╬═════╬═══════╣
║ A ║ 1 ║ 10 ║
║ B ║ 1 ║ 20 ║
║ C ║ 1 ║ 30 ║
║ D ║ 1 ║ 40 ║
║ A ║ 2 ║ 100 ║
║ B ║ 2 ║ 20 ║
║ C ║ 2 ║ 30 ║
║ D ║ 2 ║ 40 ║
║ A ║ 3 ║ 500 ║
║ B ║ 3 ║ 25 ║
║ C ║ 3 ║ 35 ║
║ D ║ 3 ║ 1000 ║
╚══════╩═════╩═══════╝
我想从这个 df 中排除所有商品的平均价格超过 200 的行。所以过滤后的 df 应该如下所示:
╔══════╦═════╦═══════╗
║ Item ║ Day ║ Price ║
╠══════╬═════╬═══════╣
║ B ║ 1 ║ 20 ║
║ C ║ 1 ║ 30 ║
║ B ║ 2 ║ 20 ║
║ C ║ 2 ║ 30 ║
║ B ║ 3 ║ 25 ║
║ C ║ 3 ║ 35 ║
╚══════╩═════╩═══════╝
我是 python 和 pandas 的新手,但第一步是考虑这样的事情来获得一个新的 df 平均价格:avg_prices_df = df.groupby('ItemID').Price.mean().reset_index 然后不知道如何从那里开始。甚至不确定第一步是否正确。
更复杂的是,我使用 vaex 读取 ndf5 格式的数据,因为我有超过 4 亿行。
非常感谢您的任何建议。
编辑:所以我得到了以下代码,尽管我确信它没有被优化..
`
创建 ItemID 及其平均价格的数据框
df_item_avg_price = df.groupby(df.ItemID, agg=[vaex.agg.count('ItemID'), vaex.agg.mean('Price')])
按平均价格阈值过滤这个新数据框
df_item_avg_price = (df_item_avg_price[df_item_avg_price["P_r_i_c_e_mean"]
创建平均价格低于阈值的 ItemID 列表
items_in_price_range = df_item_avg_price['ItemID'].tolist()
过滤原始数据框以仅包含价格范围内的项目的行
filtered_df = df[df.ItemID.isin(items_in_price_range)] ` 有更好的方法吗?
【问题讨论】:
-
请以其他人可读且易于使用的格式包含您的数据。
-
是的,我试过了。如何让表格在此处正确显示? @jezrael"的回复非常整洁。我尝试使用 table to ascii 转换器,然后将 ascii 粘贴在代码引号内..
-
我喜欢 tabulate 库的可读性,CSV 在易用性方面很棒,而且可读性很好。
标签: python pandas dataframe jupyter vaex