是否有一种有效的方法可以根据其他列的条件值使用前几行的值来计算 Pandas 中的列值?
Is there an efficient way to compute column values in Pandas using values from previous rows based on conditional values from other columns?
考虑循环遍历我的 DataFrame:
import pandas as pd
df = pd.DataFrame({
'Price': [1000, 1000, 1000, 2000, 2000, 2000, 2000, 1400, 1400],
'Count': [0, 0, 0, 0, 0, 0, 0, 0, 0]
})
for idx in df.index:
if df['Price'].iloc[idx] > 1500:
if idx > 0:
df['Count'].iloc[idx] = df['Count'].iloc[idx - 1] + 1
导致:
Price
Count
0
1000
0
1
1000
0
2
1000
0
3
2000
1
4
2000
2
5
2000
3
6
2000
4
7
1400
0
8
1400
0
有没有更有效的方法来做到这一点?
使用 Series.cumsum
, then use groupby.cumcount
创建伪组以生成组内计数:
groups = df.Price.le(1500).cumsum()
df['Count'] = df.Price.gt(1500).groupby(groups).cumcount()
# Price Count
# 0 1000 0
# 1 1000 0
# 2 1000 0
# 3 2000 1
# 4 2000 2
# 5 2000 3
# 6 2000 4
# 7 1400 0
# 8 1400 0
使用 mask
隐藏低于 1500 的值并使用 cumsum
创建计数器:
df['Count'] = df.mask(df['Price'] <= 1500)['Count'].add(1).cumsum().fillna(0).astype(int)
print(df)
# Output:
Price Count
0 1000 0
1 1000 0
2 1000 0
3 2000 1
4 2000 2
5 2000 3
6 2000 4
7 1400 0
8 1400 0
考虑循环遍历我的 DataFrame:
import pandas as pd
df = pd.DataFrame({
'Price': [1000, 1000, 1000, 2000, 2000, 2000, 2000, 1400, 1400],
'Count': [0, 0, 0, 0, 0, 0, 0, 0, 0]
})
for idx in df.index:
if df['Price'].iloc[idx] > 1500:
if idx > 0:
df['Count'].iloc[idx] = df['Count'].iloc[idx - 1] + 1
导致:
Price | Count | |
---|---|---|
0 | 1000 | 0 |
1 | 1000 | 0 |
2 | 1000 | 0 |
3 | 2000 | 1 |
4 | 2000 | 2 |
5 | 2000 | 3 |
6 | 2000 | 4 |
7 | 1400 | 0 |
8 | 1400 | 0 |
有没有更有效的方法来做到这一点?
使用 Series.cumsum
, then use groupby.cumcount
创建伪组以生成组内计数:
groups = df.Price.le(1500).cumsum()
df['Count'] = df.Price.gt(1500).groupby(groups).cumcount()
# Price Count
# 0 1000 0
# 1 1000 0
# 2 1000 0
# 3 2000 1
# 4 2000 2
# 5 2000 3
# 6 2000 4
# 7 1400 0
# 8 1400 0
使用 mask
隐藏低于 1500 的值并使用 cumsum
创建计数器:
df['Count'] = df.mask(df['Price'] <= 1500)['Count'].add(1).cumsum().fillna(0).astype(int)
print(df)
# Output:
Price Count
0 1000 0
1 1000 0
2 1000 0
3 2000 1
4 2000 2
5 2000 3
6 2000 4
7 1400 0
8 1400 0