как заменить значения предыдущими при соблюдении условий? - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь создать денормализованный кадр данных на основе полученного мной отчета. Мне нужно назначить записи для группы, и эта группа происходит из одного ряда со случайным текстом и номерами между обозначениями групп. как переписать эти значения строк при выполнении условий? Похоже, что цикл, который я написал, записывает только следующее значение, когда выполняется условие, и не делает этого, пока не будет выполнено следующее условие. Пожалуйста, посмотрите пример моих данных и кода ниже. По сути, мне нужно, чтобы строки были первичной, вторичной или любой другой группой, которую я выбрал, но она должна работать до тех пор, пока не будет достигнута следующая назначенная группа.

Текущие данные:

    Primary
    Week#
    1
    nan
    nan
    nan
    2
    nan
    nan
    nan
    Secondary
    Week#
    1
    nan
    nan
    nan
    2
    nan
    nan
    nan

Код:

for index, obj in enumerate(df['col0']):
    l = len(df['col0'])
    if obj == 'Primary':
        if index > 0:
            previous = df['col0'][index - 1]
        if index < (l - 1):
            next_ = df['col0'][index + 1]
            next_ = obj
            print (next_, obj)

    if obj == 'Secondary':
        if index > 0:
            previous = df['col0'][index - 1]
        if index < (l - 1):
            next_ = df['col0'][index + 1]
            next_ = obj
            print (next_, obj)  

Ожидаемый результат:

Primary
Primary
Primary
Primary
Primary
Primary
Primary
Primary
Primary
Primary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary

1 Ответ

0 голосов
/ 28 августа 2018

Более прискорбный способ сделать это - сохранить только те значения, которые вам интересны, и заполнить их для тех мест, которые вам не нужны. Например:

df["col0_cleaned"] = df["col0"].where(df["col0"].isin(["Primary", "Secondary"])).ffill()

Если мы предпримем это поэтапно, станет яснее, что происходит:

df["isin"] = df["col0"].isin(["Primary", "Secondary"])
df["where"] = df["col0"].where(df["col0"].isin(["Primary", "Secondary"]))
df["ffill"] = df["col0"].where(df["col0"].isin(["Primary", "Secondary"])).ffill()

, что дает мне:

In [350]: df
Out[350]: 
         col0   isin      where      ffill
0     Primary   True    Primary    Primary
1       Week#  False        NaN    Primary
2           1  False        NaN    Primary
3         nan  False        NaN    Primary
4         nan  False        NaN    Primary
5         nan  False        NaN    Primary
6           2  False        NaN    Primary
7         nan  False        NaN    Primary
8         nan  False        NaN    Primary
9         nan  False        NaN    Primary
10  Secondary   True  Secondary  Secondary
11      Week#  False        NaN  Secondary
12          1  False        NaN  Secondary
13        nan  False        NaN  Secondary
14        nan  False        NaN  Secondary
15        nan  False        NaN  Secondary
16          2  False        NaN  Secondary
17        nan  False        NaN  Secondary
18        nan  False        NaN  Secondary
19        nan  False        NaN  Secondary
...