Reputation: 4819
Assume I have a dataframe df1:
A B C D E
Date
2009-01-30 NaN NaN NaN NaN NaN
2009-02-02 NaN NaN NaN NaN NaN
2009-02-03 NaN NaN NaN NaN NaN
2009-02-04 NaN NaN NaN NaN NaN
2009-02-05 NaN NaN NaN NaN NaN
2009-02-06 NaN NaN NaN NaN NaN
2009-02-09 NaN NaN NaN NaN NaN
2009-02-10 NaN NaN NaN NaN NaN
and a Series:
Date
2009-02-04 A
2009-02-06 E
is there a fast vectorized view to set the index/columns values in df1 so as to obtain df2:
A B C D E
Date
2009-01-30 NaN NaN NaN NaN NaN
2009-02-02 NaN NaN NaN NaN NaN
2009-02-03 NaN NaN NaN NaN NaN
2009-02-04 1 NaN NaN NaN NaN
2009-02-05 NaN NaN NaN NaN NaN
2009-02-06 NaN NaN NaN NaN 1
2009-02-09 NaN NaN NaN NaN NaN
2009-02-10 NaN NaN NaN NaN NaN
Upvotes: 0
Views: 64
Reputation: 879103
import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.nan, columns=list('ABCDE'), index=pd.to_datetime(
['2009-01-30', '2009-02-02', '2009-02-03', '2009-02-04', '2009-02-05',
'2009-02-06', '2009-02-09', '2009-02-10']))
ser = pd.Series(list('AE'), index=pd.to_datetime(['2009-02-04', '2009-02-06']))
freqs = pd.get_dummies(ser)
freqs = freqs.where(freqs != 0, np.nan)
result = df1.add(freqs, fill_value=0)
print(result)
pd.get_dummies can be used to convert your Series into a frequency table:
In [117]: freqs = pd.get_dummies(ser)
In [118]: freqs = freqs.where(freqs != 0, np.nan)
In [119]: freqs
Out[119]:
col_0 A E
row_0
2009-02-04 1 NaN
2009-02-06 NaN 1
and the DataFrame.add
method can be used to add these values to df1
:
In [124]: df1.add(freqs, fill_value=0)
Out[124]:
A B C D E
2009-01-30 NaN NaN NaN NaN NaN
2009-02-02 NaN NaN NaN NaN NaN
2009-02-03 NaN NaN NaN NaN NaN
2009-02-04 1 NaN NaN NaN NaN
2009-02-05 NaN NaN NaN NaN NaN
2009-02-06 NaN NaN NaN NaN 1
2009-02-09 NaN NaN NaN NaN NaN
2009-02-10 NaN NaN NaN NaN NaN
Upvotes: 1