简体   繁体   中英

How to set the values of a dataframe given a series of indices and corresponding column names?

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
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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM