我想在pandas中创建一个新列,每5行包含特定数据(列X),如下所示
1
1
1
1
1
2
2
2
2
2
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的解决方案,可用于numpy
或pandas
:
>>> [(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
(可能是一个很好的理由!)