簡體   English   中英

有條件地將一個 DataFrame 列中的值替換為另一列中的值

[英]Conditionally replacing values in one DataFrame column with values from another column

下面是一個示例 DataFrame,其中 Y 列已經存在,但我想以這種方式從 X 列計算 Y:

如果 X 連續 3 周下降,並且累計下降 < -2%,那么這周和前幾周的 Y 應該等於 X 值下降的最后一個 X 值,最多 12 周之前。

Week    X   %Change Y
w1  96.07   NA      88.478
w2  95.835  -0.24%  88.478
w3  95.402  -0.45%  88.478
w4  94.914  -0.51%  88.478
w5  94.28   -0.67%  88.478
w6  93.042  -1.31%  88.206
w7  91.891  -1.24%  87.993
w8  90.074  -1.98%  87.189
w9  90.541  0.52%   86.637
w10 90.13   -0.45%  86.304
w11 88.635  -1.66%  86.304
w12 88.478  -0.18%  86.304
w13 88.486  0.01%   86.304
w14 87.798  -0.78%  86.304
w15 88.23   0.49%   86.304
w16 88.395  0.19%   90
w17 88.206  -0.21%  87.842
w18 87.993  -0.24%  86.301
w19 87.189  -0.91%  85.133
w20 86.637  -0.63%  83.567
w21 86.304  -0.38%  81.418
w22 86.539  0.27%   80.193
w23 88.411  2.16%   80.193
w24 89.475  1.20%   79.62
w25 90.229  0.84%   79.191
w26 90.581  0.39%   77.519
w27 90      -0.64%  77.513
w28 87.842  -2.40%  77.513
w29 86.301  -1.75%  76.651
w30 85.133  -1.35%  75.48
w31 83.567  -1.84%  74.813
w32 81.418  -2.57%  74.512
w33 80.193  -1.50%  73.479
w34 80.28   0.11%   72.895
w35 79.62   -0.82%  71.888
w36 79.191  -0.54%  71.24
w37 77.519  -2.11%  70.064
w38 77.513  -0.01%  69.456
w39 77.57   0.07%   67.542
w40 76.651  -1.18%  66.687
w41 75.48   -1.53%  65.568
w42 74.813  -0.88%  64.483
w43 74.512  -0.40%  63.60
w44 73.479  -1.39%  62.979
w45 72.895  -0.79%  62.829
w46 71.888  -1.38%  62.39
w47 71.24   -0.90%  61.819
w48 70.064  -1.65%  61.819
w49 69.456  -0.87%  61.819
w50 67.542  -2.76%  61.819
w51 66.687  -1.27%  61.819
w52 65.568  -1.68%  61.819
w53 64.483  -1.65%  61.819
w54 63.604  -1.36%  61.819
w55 62.979  -0.98%  61.819
w56 62.829  -0.24%  61.819
w57 62.39   -0.70%  61.819
w58 61.819  -0.92%  61.819
w59 61.83   0.02%   61.83
w60 62.796  1.56%   62.796
w61 63.52   1.15%   63.52
w62 65.132  2.54%   65.132
w63 66.148  1.56%   66.148
w64 66.698  0.83%   66.698
w65 67.324  0.94%   67.324
w66 68.418  1.62%   68.418
w67 68.432  0.02%   68.432
w68 67.818  -0.90%  72.41
w69 69.108  1.90%   72.296
w70 69.911  1.16%   71.682
w71 70.484  0.82%   71.411
w72 71.479  1.41%   70.835
w73 72.155  0.95%   69.561
w74 73.549  1.93%   68.628
w75 73.452  -0.13%  67.344
w76 73.928  0.65%   67.344
w77 72.832  -1.48%  67.344
w78 72.934  0.14%   67.344
w79 72.41   -0.72%  67.344
w80 72.296  -0.16%  67.344
w81 71.682  -0.85%  67.344
w82 71.411  -0.38%  67.344
w83 70.835  -0.81%  67.344
w84 69.561  -1.80%  67.344
w85 68.628  -1.34%  67.344
w86 67.344  -1.87%  67.344
w87 67.669  0.48%   67.669

根據我們在評論中的討論,我希望這能滿足您的需求:

import pandas as pd

def find_nY(i):
    """For index number i, find the number n of Y values to be replaced."""
    if df.Change[i] >= 0:
        return 1
    j = i
    while j >= 1 and df.Change[j - 1] < 0:
        j -= 1
    if i - j >= 2 and sum(df.Change[j:i+1]) <= -2:
        n = min(i - j + 1, 12)
    else:
        n = 1
    return n

def replace_Y(i):
    """Replaces Y values with X for a run of decreases ending at i."""
    n = find_nY(i)
    df.loc[i-n+1:i, 'Y'] = [df.X[i]] * n  

df = pd.read_csv('ShiftingValues.txt', sep=' ', header=0)
df['Week'] = df['Week'].str.strip('w').astype(int)
df['Change'] = df['Change'].astype(str).str.strip('%').astype(float)
df['Y'] = df['X']

for i in df.index[2:df.index[-1]]:
    if df.Change[i + 1] >= 0:
        replace_Y(i)
replace_Y(df.index[-1])

print(df.to_string())
    Week       X  Change       Y
0      1  96.070     NaN  96.070
1      2  95.835   -0.24  90.074
2      3  95.402   -0.45  90.074
3      4  94.914   -0.51  90.074
4      5  94.280   -0.67  90.074
5      6  93.042   -1.31  90.074
6      7  91.891   -1.24  90.074
7      8  90.074   -1.98  90.074
8      9  90.541    0.52  90.541
9     10  90.130   -0.45  88.478
10    11  88.635   -1.66  88.478
11    12  88.478   -0.18  88.478
12    13  88.486    0.01  88.486
13    14  87.798   -0.78  87.798
14    15  88.230    0.49  88.230
15    16  88.395    0.19  88.395
16    17  88.206   -0.21  86.304
17    18  87.993   -0.24  86.304
18    19  87.189   -0.91  86.304
19    20  86.637   -0.63  86.304
20    21  86.304   -0.38  86.304
21    22  86.539    0.27  86.539
22    23  88.411    2.16  88.411
23    24  89.475    1.20  89.475
24    25  90.229    0.84  90.229
25    26  90.581    0.39  90.581
26    27  90.000   -0.64  80.193
27    28  87.842   -2.40  80.193
28    29  86.301   -1.75  80.193
29    30  85.133   -1.35  80.193
30    31  83.567   -1.84  80.193
31    32  81.418   -2.57  80.193
32    33  80.193   -1.50  80.193
33    34  80.280    0.11  80.280
34    35  79.620   -0.82  77.513
35    36  79.191   -0.54  77.513
36    37  77.519   -2.11  77.513
37    38  77.513   -0.01  77.513
38    39  77.570    0.07  77.570
39    40  76.651   -1.18  76.651
40    41  75.480   -1.53  75.480
41    42  74.813   -0.88  74.813
42    43  74.512   -0.40  74.512
43    44  73.479   -1.39  73.479
44    45  72.895   -0.79  72.895
45    46  71.888   -1.38  71.888
46    47  71.240   -0.90  61.819
47    48  70.064   -1.65  61.819
48    49  69.456   -0.87  61.819
49    50  67.542   -2.76  61.819
50    51  66.687   -1.27  61.819
51    52  65.568   -1.68  61.819
52    53  64.483   -1.65  61.819
53    54  63.604   -1.36  61.819
54    55  62.979   -0.98  61.819
55    56  62.829   -0.24  61.819
56    57  62.390   -0.70  61.819
57    58  61.819   -0.92  61.819
58    59  61.830    0.02  61.830
59    60  62.796    1.56  62.796
60    61  63.520    1.15  63.520
61    62  65.132    2.54  65.132
62    63  66.148    1.56  66.148
63    64  66.698    0.83  66.698
64    65  67.324    0.94  67.324
65    66  68.418    1.62  68.418
66    67  68.432    0.02  68.432
67    68  67.818   -0.90  67.818
68    69  69.108    1.90  69.108
69    70  69.911    1.16  69.911
70    71  70.484    0.82  70.484
71    72  71.479    1.41  71.479
72    73  72.155    0.95  72.155
73    74  73.549    1.93  73.549
74    75  73.452   -0.13  73.452
75    76  73.928    0.65  73.928
76    77  72.832   -1.48  72.832
77    78  72.934    0.14  72.934
78    79  72.410   -0.72  67.344
79    80  72.296   -0.16  67.344
80    81  71.682   -0.85  67.344
81    82  71.411   -0.38  67.344
82    83  70.835   -0.81  67.344
83    84  69.561   -1.80  67.344
84    85  68.628   -1.34  67.344
85    86  67.344   -1.87  67.344
86    87  67.669    0.48  67.669

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM