如何在给定一系列索引和相应列名的情况下设置数据帧的值?

时间:2014-06-29 21:16:12

标签: python pandas indexing

假设我有一个数据帧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

和一系列:

Date
2009-02-04 A
2009-02-06 E

是否有一个快速矢量化视图来设置df1中的索引/列值以获得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

1 个答案:

答案 0 :(得分:1)

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可用于将您的系列转换为频率表:

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

可以使用DataFrame.add method将这些值添加到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