A B C
0 blue 14.5 14.0
1 blue 14.0 14.0
2 blue 13.5 14.0
3 blue 12.0 14.0
4 blue 10.5 14.0
5 green 20.0 19.0
6 green 19.0 19.0
7 green 18.5 19.0
8 green 18.0 19.0
9 green 17.5 19.0
10 green 16.0 19.0我想为每个A组(“蓝色”和“绿色”)创建一个新的带有下一个条件的df1:
13.0“蓝色组”,请选择df中存在的下一行,即:
3 blue 12.0 14.0df1应该是:
A B C
1 blue 14.0 14.0
3 blue 12.0 14.0
6 green 19.0 19.0
8 green 18.0 19.0我试过:
df1 = df[(df["B"] == df["C"]) | (df["B"] == df["C"]-1)]发布于 2018-03-04 22:16:52
对于第二个条件:B = C - 1,
B - C <= -1,然后发布于 2018-03-04 19:42:47
条件:
row where B = C - 1if not exists B = C - 1, then row with largest B, such that B < C - 1可以合并为一个条件:
row with largest B, such that B <= C - 1如果您的数据是第一个条件,即所有组都存在row where B = C,那么您可以这样编写投影:
res = df[(df.B == df.C) | (df.B <= df.C - 1)].sort_values('B').groupby('A').tail(2)
# output:
A B C
3 blue 12.0 14.0
1 blue 14.0 14.0
8 green 18.0 19.0
6 green 19.0 19.0如果第一个条件,B = C与某些组不匹配,那么使用pd.concat合并两个单独的投影:
res = pd.concat([df[df.B == df.C],
df[df.B <= df.C - 1].sort_values('B').groupby('A').tail(1)])
# or you can split this long line into a couple of lines for better
# readibility
# p1 = df[df.B == df.C]
# p2 = df[df.B <= df.C - 1].sort_values('B').groupby('A').tail(1)
# res = pd.concat([p1, p2])
# output:
A B C
1 blue 14.0 14.0
6 green 19.0 19.0
3 blue 12.0 14.0
8 green 18.0 19.0如您所见,对于第二个解决方案,行不会按照问题中指定的顺序返回,因此,如果需要排序结果,则可能需要进一步的多列排序:
res.sort_values(['C', 'B'], ascending=[True, False])发布于 2018-03-04 16:16:57
使用:
D,并通过GroupBy.cumcount通过计数器减去C -获取所有可能的值B == C-0,1,2,3...isin对每个组进行groupby筛选,删除列DA和B对sort_values进行排序boolean indexing按计数器过滤每组前2行df['D'] = df['C'].sub(df.groupby('A').cumcount())
df = df[df.groupby('A').apply(lambda x: x['B'].isin(x['D'])).values].drop('D',1)
df = df.sort_values(['A','B'], ascending=[True, False])
df = df[df.groupby('A').cumcount() < 2]
print (df)
A B C
1 blue 14.0 14.0
3 blue 12.0 14.0
6 green 19.0 19.0
8 green 18.0 19.0https://stackoverflow.com/questions/49096679
复制相似问题