假设我有一个像这样的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
希望通过这个例子让我自己清楚。
答案 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