向df添加列并创建条件序列

时间:2019-05-08 13:44:24

标签: python pandas

我有一个熊猫数据框'df',其中一个名为“ Value”的列如下所示:

import pandas as pd
df = pd.DataFrame({'Value':[240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255]})

Value
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255

我想做的是添加第二列“ NewValue”,这样我就得到了这样的列:

Value NewValue
240   7
241   8
242   9
243   10
244   11
245   12
246   13
247   14
248   15
249   0
250   1
251   2
252   3
253   4
254   5
255   6

第二列应包含从0到15的升序,其中变量zerovalue定义值0的(索引)位置。在上面的示例zerovalue = 249中。
我知道我可以添加一个新列并基于rowIndex更改行值,如下所示:

rowIndex = df.index[9]
df.loc[rowIndex, 'NewValue'] = 0

我如何添加第二列,该列包含上面示例中的系列,并且定义零列位置的zerovalue可以更改?

3 个答案:

答案 0 :(得分:3)

我将cumsumagrsort一起使用,然后通过index分配值

s=df.Value.eq(249).cumsum()
df.loc[s.iloc[(-s).argsort()].index,'NewValue']=np.arange(len(df))
df
Out[134]: 
    Value  NewValue
0     240         7
1     241         8
2     242         9
3     243        10
4     244        11
5     245        12
6     246        13
7     247        14
8     248        15
9     249         0
10    250         1
11    251         2
12    252         3
13    253         4
14    254         5
15    255         6

答案 1 :(得分:1)

您可以使用np.roll,首先使用布尔条件和sum计算换档位置:

shift = (df['Value'] < 249).sum()
df['NewValue'] = np.roll(np.arange(len(df)), shift)

输出:

    Value  NewValue
0     240         7
1     241         8
2     242         9
3     243        10
4     244        11
5     245        12
6     246        13
7     247        14
8     248        15
9     249         0
10    250         1
11    251         2
12    252         3
13    253         4
14    254         5
15    255         6

答案 2 :(得分:0)

使用此:

df['NewValue'] = np.arange(0, len(df.Value))
df['NewValue'].shift(np.argwhere(df.Value== zerovalue)[0][0]).fillna(0) + df['NewValue'].shift(np.argwhere(df.Value== zerovalue)[0][0] - len(df.Value)).fillna(0)

它首先创建一个从0到长度范围的列,然后将其按零值的索引向下推,然后再次创建另一个列,该列将拉出溢出的数字并将其合并。