【发布时间】:2019-02-26 19:50:32
【问题描述】:
我有一个包含名称、年份、标签和一堆其他变量的 DataFrame。 所以它可能看起来像这样
df = pd.DataFrame({
"name": 4*["A"] + 5*["B"],
"year": [1999,2000,2001,2002,2010,2011,2012,2013,2014],
"tag": [0,1,0,0,1,0,0,1,0],
"x1": np.random.normal(size=9),
"x2": np.random.uniform(size=9)
})
print df
name tag x1 x2 year
0 A 0 -1.352707 0.932559 1999
1 A 1 -1.359828 0.724635 2000
2 A 0 1.289980 0.477135 2001
3 A 0 -0.409960 0.863443 2002
4 B 1 -1.469220 0.324349 2010
5 B 0 0.372617 0.871734 2011
6 B 0 -0.047398 0.307596 2012
7 B 1 1.240108 0.667082 2013
8 B 0 0.558432 0.284363 2014
我正在寻找一种方法将 DataFrame 分组或拆分成块,每个块都应包含
- tag==1 和 的一行
- tag==0、row[year+1] 和 row[year-1] 存在的所有行,row[[year+-1,"tag"]]==1 和 row[[year+-1," name"]]==row[[year,"name"]]。
简单地说,我想要大小为 3 的块,其中中间行被标记,并且被同一公司的两行未标记的行包围。 所以在上面的例子中,只有两个通过这些条件的块是
name tag x1 x2 year
0 A 0 -1.352707 0.932559 1999
1 A 1 -1.359828 0.724635 2000
2 A 0 1.289980 0.477135 2001
和
7 B 0 -0.047398 0.307596 2012
8 B 1 1.240108 0.667082 2013
9 B 0 0.558432 0.284363 2014
我曾考虑按多列分组,但问题是我需要分组的行除了名称之外没有任何共同点。 我还考虑过手动引入(在 for 循环中)另一列,为每个块提供一个新 ID,然后我可以将其分组。然而,我对这种方法非常不满意,因为它看起来既不高效也不优雅。
我会很感激任何想法。
【问题讨论】:
-
您的问题有点不清楚您想要数据的方式。您想要返回其中一个块的语法,还是想要一个
DataFrame中的所有块? -
我想要返回下一个块或所有块的 DataFrame 的代码。
标签: python pandas dataframe pandas-groupby