【问题标题】:pandas combing dataframes optimisationpandas 结合数据框优化
【发布时间】:2018-09-15 01:07:06
【问题描述】:

嘿,我在 pandas 中有一个时间序列顺序数据集,其中某些日期缺少值来纠正它我正在尝试从以前可用的日期中获取值。

for date in dates_missing:
    df_temp = df[df.order_date<date].sort_values(['order_date'],ascending=False)
    supplier_map = df_temp.groupby('supplier_id')['value'].first()

    for supplier_id in supplier_map.index.values:
        df[(df.order_datetime==date)&(df.su_id == supp)]['value'] = supplier_map.get(supplier_id)

为了解释代码,我将遍历丢失的日期,然后获取丢失日期之前的值列表。 然后使用 pandas first() 获取供应商 ID 到值映射

现在最慢的部分是更新回原始数据帧

我正在遍历每个供应商并更新原始数据框中的值。

需要建议来加快这个内部 for 循环

例子:

|order_date|supplier_id |value |sku_id| |2017-12-01| 10 | 1.0 | 1 | |2017-12-01| 9 | 1.3 | 7 | |2017-12-01| 3 | 1.4 | 2 | |2017-12-02| 3 | 0 | 2 | |2017-12-02| 9 | 0 | 7 | |2017-12-03| 3 | 1.0 | 2 | |2017-12-03| 10 | 1.0 | 1 | |2017-12-03| 9 | 1.3 | 7 |

修复日期 2017-12-02

|2017-12-02| 3 | 0 | 2 | |2017-12-02| 9 | 0 | 7 |

修正数据框

|order_date|supplier_id |value |sku_id| |2017-12-01| 10 | 1.0 | 1 | |2017-12-01| 9 | 1.3 | 7 | |2017-12-01| 3 | 1.4 | 2 | |2017-12-02| 3 | 1.4 | 2 | |2017-12-02| 9 | 1.3 | 7 | |2017-12-03| 3 | 1.0 | 2 | |2017-12-03| 10 | 1.0 | 1 | |2017-12-03| 9 | 1.3 | 7 | PS: 我可能对这个问题不太清楚,所以很乐意回答疑问并重新编辑帖子继续前进。

【问题讨论】:

  • 您的日期是否连续丢失或与该日期相关的某些值丢失,您能澄清一下吗?
  • 您能否提供minimal reproducible example 一些示例数据和您的预期输出?如果不了解缺失数据的实际表示方式,很难提供真正的答案。
  • 为什么不使用 pd.interpolate ?
  • @NagaKiran 数据是行,但某些日期的值为零
  • @AnnaIliukovich-Strakovskaia我猜缺少示例让混淆提供一个清晰的上下文

标签: python pandas dataframe optimization


【解决方案1】:

您可以按天和供应商 ID 对数据框进行分组,对于每个分组的数据框,将 0 替换为 Null,一旦您使用前向填充获得空填充,对于早期值,您可以使用后向填充,

这可能会减少你的时间

df.replace(0,np.nan,inplace=True)
df['values'] = df.groupby([df.supplier_id])['values'].apply(lambda x: x.replace(0,np.nan).fillna(method='ffill').fillna(method = 'bfill'))

输出:

    order_date  sku_id  supplier_id values
0   2017-12-01  1   10  1.0
1   2017-12-01  7   9   1.3
2   2017-12-01  2   3   1.4
3   2017-12-02  2   3   1.4
4   2017-12-02  7   9   1.3
5   2017-12-03  2   3   1.0
6   2017-12-03  1   10  1.0
7   2017-12-03  7   9   1.3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 2018-10-11
    • 2017-11-03
    • 2019-11-10
    • 2015-07-25
    • 2016-06-06
    相关资源
    最近更新 更多