我有一个看起来像这样的数据框:
df =
a b c d e
0 1 1 0 1 1
1 0 0 0 1 1
2 0 0 0 0 0
3 1 1 1 0 0
4 0 0 0 0 0
5 1 1 1 1 1
我想创建另一个列“ rank”,该列每4行划分一次该数据帧。
我正在寻找的结果
df =
a b c d e result
0 1 1 0 1 1 0
1 0 0 0 1 1 0
2 0 0 0 0 0 0
3 1 1 1 0 0 0
4 0 0 0 0 0 1
5 1 1 1 1 1 1
. . . . . . .
. . . . . . .
我正在做的事情是:
我创建了一个列表并将该列表分为6组
seq=[i for i in range(0,len(df))]
nn=[seq[i:i+4] for i in range(0,len(seq),4)]
然后我创建了一个映射值的函数
def map(number):
for i in range(0,len(df)):
if number in nn[i]:
return i
和二手地图。
df['rank']=df['index'].map(lambda x: map(x))
是否有更好的方法来做我想做的事情?我确定有更有效的方法吗?如果有人可以帮助我解决此问题,我将不胜感激。
谢谢。
答案 0 :(得分:3)
怎么样:
df['rank'] = df.reset_index().index // 4
编辑以反映Pault的评论:如果可以确定原始索引是从0开始的连续整数,则可以不用reset_index()
:df.index//4
。
答案 1 :(得分:0)
使用np.repeat
:
result = np.repeat(range(4), 4)[:len(df)]
df['result'] = result
print(df)
a b c d e result
0 1 1 0 1 1 0
1 0 0 0 1 1 0
2 0 0 0 0 0 0
3 1 1 1 0 0 0
4 0 0 0 0 0 1
5 1 1 1 1 1 1