如何使用重复的一系列值向数据框添加列?

时间:2017-11-13 01:26:24

标签: python pandas dataframe

说出数据框:

Ind  d1  d2  d3  
0      x0     x0     x0  
1      x1     x1     x1  
2      x2     x2     x2  
...  
n      xn     xn     xn

我想添加一个新列,以便重复1 2 3 4 5模式,直到达到n。即

Ind  d1  d2  d3  d4    
0      x0     x0     x0     1  
1      x1     x1     x1     2  
2      x2     x2     x2     3  
3      x3     x3     x3     4  
4      x4     x4     x4     5  
5      x5     x5     x5     1  
6      x6     x6     x6     2  
...  
n      xn     xn     xn     (1,2,3,4 or 5 depending on n)

3 个答案:

答案 0 :(得分:4)

<强>设置
考虑一下Pandas数据框df

np.random.seed([3,1415])

df = pd.DataFrame(
    np.random.choice(list('abcdefghij'), (12, 3)),
    columns=['d1', 'd2', 'd3']
)

df

   d1 d2 d3
0   a  c  h
1   d  i  h
2   a  g  i
3   g  a  c
4   a  e  j
5   h  d  c
6   e  d  d
7   g  h  h
8   e  f  d
9   h  f  j
10  i  h  g
11  e  h  g

<强>解决方案
尝试使用modulo

df.assign(d4=np.arange(len(df)) % 5 + 1)

   d1 d2 d3  d4
0   a  c  h   1
1   d  i  h   2
2   a  g  i   3
3   g  a  c   4
4   a  e  j   5
5   h  d  c   1
6   e  d  d   2
7   g  h  h   3
8   e  f  d   4
9   h  f  j   5
10  i  h  g   1
11  e  h  g   2

扩展解决方案
容易申请重复任何事情。假设我有一个单词数组a

a = np.array(['one', 'six', 'foot', 'red', 'big'])

df.assign(d4=a[np.arange(len(df)) % len(a)])

   d1 d2 d3    d4
0   a  c  h   one
1   d  i  h   six
2   a  g  i  foot
3   g  a  c   red
4   a  e  j   big
5   h  d  c   one
6   e  d  d   six
7   g  h  h  foot
8   e  f  d   red
9   h  f  j   big
10  i  h  g   one
11  e  h  g   six

答案 1 :(得分:4)

使用piR的数据。

df['new']=0
np.put(df['new'], np.arange(len(df)), [1,2,3,4,5])
df
Out[343]: 
   d1 d2 d3  new
0   i  j  i    1
1   a  e  a    2
2   d  j  i    3
3   i  a  a    4
4   c  j  d    5
5   i  a  h    1
6   h  d  c    2
7   a  e  a    3
8   a  f  i    4
9   a  h  f    5
10  d  b  d    1
11  b  c  c    2

答案 2 :(得分:2)

选项1
np.tile

df

    A   B   C
0  13  11   2
1   8   8   6
2   7   6  13
3  13  16   4
4   3   1   3
5   2  27   9
6  20   1   2
7   5   3   9
8   0  10   1
9   1   7   4

np.tile(np.arange(1, 6), len(df) // 5 + 1)[:len(df)]
array([1, 2, 3, 4, 5, 1, 2, 3, 4, 5])

将结果分配给一个列,您就可以了。

选项2
groupby + cumcount

df.groupby(df.index // 5 * 5).cumcount() + 1

0    1
1    2
2    3
3    4
4    5
5    1
6    2
7    3
8    4
9    5
dtype: int64