pandas:添加每几行递增的新列

时间:2017-09-25 09:18:12

标签: python pandas numpy

我想在pandas中创建一个新列,每5行包含特定数据(列X),如下所示

1
1
1
1
1
2
2
2
2
2
3

3 个答案:

答案 0 :(得分:2)

您可以使用numpy.repeat索引和loc重复多列:

注意 - 索引值必须是唯一的。

df = pd.DataFrame({'A':list('agb'),
                   'B':[4,5,4],
                   'C':[7,8,9]})

print (df)
   A  B  C
0  a  4  7
1  g  5  8
2  b  4  9

df = df.loc[df.index.repeat(5)].reset_index(drop=True)
print (df)
    A  B  C
0   a  4  7
1   a  4  7
2   a  4  7
3   a  4  7
4   a  4  7
5   g  5  8
6   g  5  8
7   g  5  8
8   g  5  8
9   g  5  8
10  b  4  9
11  b  4  9
12  b  4  9
13  b  4  9
14  b  4  9

如果只需要一列:

df = pd.DataFrame({'D': df.A.values.repeat(5)})
print (df)
    D
0   a
1   a
2   a
3   a
4   a
5   g
6   g
7   g
8   g
9   g
10  b
11  b
12  b
13  b
14  b

答案 1 :(得分:0)

这是一个仅限python的解决方案,可用于numpypandas

>>> [(x+1) for x in range(3) for _ in range(5)]
[1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3]

举个例子:

>>> import pandas as pd
>>> pd.DataFrame([(x+1) for x in range(3) for _ in range(5)])
    0
0   1
1   1
2   1
3   1
4   1
5   2
6   2
7   2
8   2
9   2
10  3
11  3
12  3
13  3
14  3

答案 2 :(得分:0)

另一种选择:

df['new'] = df.index / 5

使用奇数python 2分区来覆盖您的索引。 (我确定在3中有类似的方法吗?)

编辑:

df['new'] = df.index / 5 + 1

可以为您提供1而不是0的值

python 3感谢BusyBee:

df['new']= (df.index / 5 + 1).astype(int)

如果你想从第x行开始:

import pandas as pd

df = pd.DataFrame({'data': range(50)}, columns=['data'])

x = 23

df['two'] = None

df.loc[x:, 'two'] = df.index[x:] / 5 +1

print df

如果你想从x开始然后从1开始编号你需要减去x

df.loc[x:, 'two'] = (df.index[x:] - x) / 5 +1

但我不确定这是否是最好的方法。

您可以在申请后使用.shift,但出于某种原因,您无法转移df.index(可能是一个很好的理由!)