spitfiredd
spitfiredd

Reputation: 3135

Pandas increment integer at certain index points?

Say I have a list of integers which correspond to points where I want to increase an interger value by 1.

for example Int64Index([5, 10]), not necessarily even spaced like that, and I have a dataframe like,

    val          new_col
0   0.729726564  1
1   0.067509062  1
2   0.943927114  1
3   0.037718436  1
4   0.512142908  1
5   0.767198655  2
6   0.202230787  2
7   0.343767479  2
8   0.540026305  2
9   0.256425022  2
10  0.403845023  3
11  0.444475008  3
12  0.464677745  3

I want to create new_col which is an int, but increases by on a the above index rows.

Edit:

import pandas as pd
import numpy as np

df = pd.DataFrame({'val': np.random.rand(14)})
df['new_col'] = 1

How to increase the value of new_col by one at each index point (5, 10)?

Upvotes: 2

Views: 338

Answers (2)

adhg
adhg

Reputation: 10873

I see from your comment that you refer to an "arbitrary position" so you can space them as you wish with bins.

example:

bins = [-1,3,5,12,14] #space as you wish
labels = [1,2,3,4] #labels or in your case values that you want

df['new_col'] = pd.cut(list(df.index.values), bins=bins, labels=labels)


val new_col
0   0.509742    1
1   0.081701    1
2   0.990583    1
3   0.813398    1
4   0.905022    2
5   0.951973    2
6   0.702487    3
7   0.916432    3
8   0.647568    3
9   0.955188    3
10  0.875067    3
11  0.284496    3
12  0.393931    3
13  0.341115    4

Upvotes: 1

Chris
Chris

Reputation: 29742

Use numpy.split with enumerate:

import pandas as pd

indices = [5, 10]
df['add_col'] = pd.concat([s + n for n, s in enumerate(pd.np.split(df['new_col'], indices))])
print(df)

Output:

         val  new_col  add_col
0   0.953431        1        1
1   0.929134        1        1
2   0.548343        1        1
3   0.080713        1        1
4   0.465212        1        1
5   0.290549        1        2
6   0.570886        1        2
7   0.232350        1        2
8   0.036968        1        2
9   0.455084        1        2
10  0.385177        1        3
11  0.811477        1        3
12  0.802502        1        3
13  0.001847        1        3

Upvotes: 0

Related Questions