熊猫意味着邻居为零?

时间:2019-01-29 18:26:14

标签: python pandas

我有以下数据:

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进行此操作的正确方法是什么?

2 个答案:

答案 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