如何获得指示组中第一次出现的指标矩阵

时间:2017-11-30 02:02:34

标签: python pandas

假设我有一个像这样的DataFrame

x = pd.DataFrame(index = pd.date_range(start="2017-1-1", end="2017-1-13"), 
columns="a b c".split())
x.ix[0:2, "a"] = 1
x.ix[5:10, "a"] = 1
x.ix[9:12, "b"] = 1
x.ix[1:3, "c"] = 1
x.ix[5, "c"] = 1

    a   b   c
2017-01-01  1   NaN NaN
2017-01-02  1   NaN 1
2017-01-03  NaN NaN 1
2017-01-04  NaN NaN NaN
2017-01-05  NaN NaN NaN
2017-01-06  1   NaN 1
2017-01-07  1   NaN NaN
2017-01-08  1   NaN NaN
2017-01-09  1   NaN NaN
2017-01-10  1   1   NaN
2017-01-11  NaN 1   NaN
2017-01-12  NaN 1   NaN
2017-01-13  NaN NaN NaN

结果应为

a   b   c
2017-01-01  1   NaN NaN
2017-01-02  NaN NaN 1
2017-01-03  NaN NaN NaN
2017-01-04  NaN NaN NaN
2017-01-05  NaN NaN NaN
2017-01-06  1   NaN 1
2017-01-07  NaN NaN NaN
2017-01-08  NaN NaN NaN
2017-01-09  NaN NaN NaN
2017-01-10  NaN 1   NaN
2017-01-11  NaN NaN NaN
2017-01-12  NaN NaN NaN
2017-01-13  NaN NaN NaN

以下生成上述所需输出:

y = pd.DataFrame(index = pd.date_range(start="2017-1-1", end="2017-1-13"), 
columns="a b c".split())
y.ix[0, "a"] = 1
y.ix[5, "a"] = 1
y.ix[9, "b"] = 1
y.ix[1, "c"] = 1
y.ix[5, "c"] = 1

希望通过这个例子让我自己清楚。

1 个答案:

答案 0 :(得分:1)

我尽力了解你的需求......

ids=x.apply(lambda y : y.groupby(y.isnull().diff().cumsum().fillna(0)).idxmax()).stack()
y.combine_first(pd.crosstab(ids,ids.index.get_level_values(1)).replace(0,np.nan))

Out[49]: 
col_0         a    b    c
2017-01-01  1.0  NaN  NaN
2017-01-02  NaN  NaN  1.0
2017-01-03  NaN  NaN  NaN
2017-01-04  NaN  NaN  NaN
2017-01-05  NaN  NaN  NaN
2017-01-06  1.0  NaN  1.0
2017-01-07  NaN  NaN  NaN
2017-01-08  NaN  NaN  NaN
2017-01-09  NaN  NaN  NaN
2017-01-10  NaN  1.0  NaN
2017-01-11  NaN  NaN  NaN
2017-01-12  NaN  NaN  NaN
2017-01-13  NaN  NaN  NaN