Добавление столбца с логическими значениями, основанными на месяце во фрейме данных pandas - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь получить 1 для строки 2020-01, только когда строка пересекает столбец "Ян". И то же самое для каждого месяца:

  • столбец Feb и строка 2019-02 также должны привести к 1, а остаток строки 2019-02 должен быть 0.
  • столбец Mar и строка 2019-03 также должны привести к 1, а остальная часть строки 2019-03 должна быть 0.

Таким образом, все вместе, один раз в строке, должно быть одно 1 и несколько 0 в зависимости от месяца. Это то, что я попробовал, и в результате получился скриншот без синего редактирования.

columns = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov"]

for i in range(len(columns)):
    df[columns[i]] = df.TIME.astype(str).str[5] + df.TIME.astype(str).str[6]
df

Синее редактирование - это цель.

enter image description here

Я пробовал троичные операторы, подобные этому:

for i in range(len(columns)):
    df[columns[i]] = 1 if (df.TIME.astype(str).str[5] + df.TIME.astype(str).str[6] == "01") else 0

, и ошибка:

ValueError: Значение истинности Серии неоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

1 Ответ

2 голосов
/ 04 февраля 2020

Вы можете использовать datetime.dt.stftime с %b форматером, get_dummies, reindex и join вернуться к исходному фрейму данных:

# Example setup
columns = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov"]

df = pd.DataFrame({'TIME': ['2020-01', '2019-12', '2019-11', '2019-10', '2019-09']})    

df.join(pd.to_datetime(df['TIME']).dt.strftime('%b')
        .str.get_dummies()
        .reindex(columns=columns, fill_value=0))

[out]

      TIME  Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov
0  2020-01    1    0    0    0    0    0    0    0    0    0    0
1  2019-12    0    0    0    0    0    0    0    0    0    0    0
2  2019-11    0    0    0    0    0    0    0    0    0    0    1
3  2019-10    0    0    0    0    0    0    0    0    0    1    0
4  2019-09    0    0    0    0    0    0    0    0    1    0    0

Edit

Я добавил это только с тех пор, как вы специально его запросили ... Вот пример того, как вы можете l oop через фрейм данных и столбцы для обновления значений - снова я просто повторю, что это не то, что я бы порекомендовал лично, и очень неэффективно сопоставлено с вышеупомянутым:

import datetime as dt

columns = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov"]

df = pd.DataFrame({'TIME': ['2020-01', '2019-12', '2019-11', '2019-10', '2019-09']})

for c in columns:
    for i, t in df['TIME'].iteritems():
        if dt.datetime.strptime(t, '%Y-%m').strftime('%b') == c:
            df.loc[i, c] = 1
        else:
            df.loc[i, c] = 0
...