Вы можете использовать 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