我有以下数据:
1: 0
2: 800
3: 800
4: 800
5: 800
6: 0
7: 0
8: 800
9: 800
10: 0
11: 800
12: 0
现在,我想用400(实际上是800的平均值和相邻0的平均值)替换所有与零(之前或之后)相邻的800s。
最终结果:
1: 0
2: 400
3: 800
4: 800
5: 400
6: 0
7: 0
8: 400
9: 400
10: 0
11: 400
12: 0
使用Pandas DataFrame进行此操作的正确方法是什么?
答案 0 :(得分:0)
您可以根据2个布尔条件的并集将序列减半:
df = pd.DataFrame({'col': [0, 800, 800, 800, 800, 0, 0, 800, 800, 0, 800, 0]})
df.loc[df['col'].shift().eq(0) | df['col'].shift(-1).eq(0), 'col'] //= 2
print(df)
col
0 0
1 400
2 800
3 800
4 400
5 0
6 0
7 400
8 400
9 0
10 400
11 0
答案 1 :(得分:0)
使用您提供的示例:
d = pd.Series([0, 800, 800, 800, 800, 0, 0, 800, 800, 0, 800, 0])
0 0
1 800
2 800
3 800
4 800
5 0
6 0
7 800
8 800
9 0
10 800
11 0
dtype: int64
为每个条件创建过滤器:
# Check if value of prev row is 0
up = d.shift(1) == 0
# Check if value of next row is zero
dn = d.shift(-1) == 0
# Check if value of current row is 800
o = d == 800
然后根据您的算法找到满足条件的索引:
idxs = o & (up | dn)
idxs = idxs[idxs == True]
最后将每个所需索引的值更改为400:
d.loc[idxs.index] = 400
哪个输出:
0 0
1 400
2 800
3 800
4 400
5 0
6 0
7 400
8 400
9 0
10 400
11 0
dtype: int64