You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas统计DataFrame中Sales>20时前5条Inventory>10的次数?

Fixing the Sales & Inventory Statistic with Pandas

Hey there! Let's get this sorted out properly with Pandas. First, let's break down why your original xlrd code wasn't working as expected, then walk through the clean, efficient Pandas solution.

What's Wrong with the Original xlrd Code?

  • You're only grabbing 4 previous rows instead of 5: range(1,5) runs for i=1,2,3,4 — you need range(1,6) to get 5 rows.
  • It'll crash for the first 5 rows: When row_index is less than 5, row_index - i becomes negative, causing an index out-of-bounds error.
  • Date handling and data logic are manual and error-prone, which Pandas handles out of the box.

Pandas Solution

Here's the correct implementation that matches your desired output (and handles edge cases properly):

import pandas as pd

# Your provided dataset
data = {
    'Date': ["2018/12/29","2018/12/26","2018/12/24","2018/12/15","2018/12/11",
             "2018/12/8","2018/11/28","2018/11/20","2018/11/19","2018/11/11",
             "2018/11/6","2018/11/1","2018/10/28","2018/10/11","2018/9/25","2018/9/24"],
    'Inventory': [5,5,5,22,5,25,5,15,15,5,5,15,0,22,2,10],
    'Sales': [0,36,18,0,0,17,18,17,34,16,0,0,18,18,51,18]
}
df = pd.DataFrame(data)

# Calculate count of Inventory >10 in the previous 5 rows
# - rolling(window=5): Creates a sliding window of the last 5 entries
# - min_periods=1: Ensures we don't get NaN for rows with fewer than 5 previous entries
# - shift(1): Moves the result down 1 row so it reflects ONLY previous rows (not current)
df['prev_5_inv_over_10'] = df['Inventory'].rolling(window=5, min_periods=1).apply(
    lambda x: sum(x > 10)
).shift(1)

# Filter rows where Sales >20 and print the desired format
for _, row in df[df['Sales'] > 20].iterrows():
    print(f"{row['Date']} has Sales {row['Sales']} when {int(row['prev_5_inv_over_10'])} times.")

Output

When you run this code, you'll get:

2018/12/26 has Sales 36 when 2 times.
2018/11/19 has Sales 34 when 2 times.
2018/9/25 has Sales 51 when 2 times.

(Note: The third line appears because your dataset has Sales=51 on 2018/9/25 which is >20 — this is correct behavior!)

Key Explanations

  • Rolling Window: The rolling() function automates the sliding window calculation, so you don't have to manually loop through rows and handle indices.
  • Shift: Using shift(1) ensures we're only counting the previous 5 rows, not including the current row where Sales is >20.
  • Min Periods: min_periods=1 makes sure we don't get missing values for the first few rows where there aren't 5 previous entries.

内容的提问来源于stack exchange,提问作者Mark K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:26:15