我有一个熊猫数据框'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
可以更改?
答案 0 :(得分:3)
我将cumsum
与agrsort
一起使用,然后通过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到长度范围的列,然后将其按零值的索引向下推,然后再次创建另一个列,该列将拉出溢出的数字并将其合并。