![](/img/trans.png)
[英]How do I replace a value in pandas DataFrame based on a condition?
[英]How do I change value in a pandas series based on condition
我有一個只有二進制值的熊貓系列
0
0 1
1 0
2 0
3 0
4 1
5 0
6 1
7 0
8 0
9 1
10 0
11 1
12 0
13 1
14 0
我想要將系列中的值轉換為零,並且它周圍有一個,即基本上改變1,0,1到1,1,1。
我需要的輸出是:
0 1
1 0
2 0
3 0
4 1
5 1
6 1
7 0
8 0
9 1
10 1
11 1
12 1
13 1
14 0
我在這里嘗試的是創建一個3的滾動窗口,並檢查值是否是我需要的。 有沒有更好的方法來做這個?
>>> window = df.rolling(3, center=True)
>>> (df[0] | window.apply(lambda x: 1 if (x == [1,0,1]).all() else 0)[0].fillna(0)).astype(int)
注意:我也試過了換檔功能。
使用shift
作為布爾掩碼,並通過numpy.where
設置1
:
m1 = df[0].shift() == 1
m2 = df[0].shift(-1) == 1
m3 = df[0] == 0
df[0] = np.where(m1 & m2 & m3, 1, df[0])
print (df)
0
0 1
1 0
2 0
3 0
4 1
5 1
6 1
7 0
8 0
9 1
10 1
11 1
12 1
13 1
14 0
您可以使用rolling
來執行長度為3的居中移動窗口,然后檢查列0
的值是否為0並且同時該索引處的居中移動窗口的sum
為2,這意味着周圍的樣本是1:
df['window'] = df.rolling(3, center = True).sum()
idx = df[(df.window == 2.0) & (df['0'] == 0)].index.values
df.loc[idx,'0'] = 1
print(df['0'])
0 1
1 0
2 0
3 0
4 1
5 1
6 1
7 0
8 0
9 1
10 1
11 1
12 1
13 1
14 0
您也可以針對特定情況使用卷積。
您可以使用以下過濾器:
[0.5, 0, 0.5]
這意味着只有當周圍的位置是一個位置時才能得到一個位置。
然后,您可以將其用作將系列值更改為1的索引。
from scipy.signal import convolve
print(df)
0 1
1 0
2 0
3 0
4 1
5 0
6 1
7 0
8 0
9 1
10 0
11 1
12 0
13 1
14 0
dtype: int64
df.iloc[convolve(df, [0.5, 0, 0.5], mode='same') == 1] = 1
print(df)
0 1
1 0
2 0
3 0
4 1
5 1
6 1
7 0
8 0
9 1
10 1
11 1
12 1
13 1
14 0
做了一點時間檢查:
def check_convolve(df):
df.iloc[convolve(df, [0.5, 0, 0.5], mode='same') == 1] = 1
def check_shifts(df):
m1 = df.shift() == 1
m2 = df.shift(-1) == 1
m3 = df == 0
df = np.where(m1 & m2 & m3, 1, df[0])
%timeit check_convolve(df)
205 µs ± 22.5 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit check_shifts(df)
1.16 ms ± 37.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.