Pandas计算列中负值的序列

时间:2017-07-29 09:04:32

标签: python pandas

我在Pandas Dataframe列“B”中有值可以是正数还是负数:

data=[[5889.25, 738.0],
 [5896.5, 49.0],
 [5897.5, 130.0],
 [5899.5, -266.0],
 [5903.75, -126.0],
 [5903.75, -512.0],
 [5898.75, -141.0],
 [5897.5, -303.0],
 [5895.0, -107.0],
 [5893.25, 27.0]]

pd.DataFrame(data,columns=['A','B'])

    A   B
0   5889.25 738.0
1   5896.50 49.0
2   5897.50 130.0
3   5899.50 -266.0
4   5903.75 -126.0
5   5903.75 -512.0
6   5898.75 -141.0
7   5897.50 -303.0
8   5895.00 -107.0
9   5893.25 27.0

什么是快速pythonic方法使列“C”计算“B”中的数字是多少?所以数据框看起来像:

    A   B   C
0   5889.25 738.0   0
1   5896.50 49.0    0
2   5897.50 130.0   0
3   5899.50 -266.0  1
4   5903.75 -126.0  2
5   5903.75 -512.0  3
6   5898.75 -141.0  4
7   5897.50 -303.0  5
8   5895.00 -107.0  6
9   5893.25 27.0    0

1 个答案:

答案 0 :(得分:5)

您可以使用np.where查找否定值,然后使用groupbycumcount()+1

data=[[5889.25, 738.0],
 [5896.5, 49.0],
 [5897.5, 130.0],
 [5899.5, -266.0],
 [5903.75, -126.0],
 [5903.75, -512.0],
 [5898.75, -141.0],
 [5897.5, -303.0],
 [5895.0, -107.0],
 [5893.25, 27.0]]

df = pd.DataFrame(data,columns=['A','B'])
df['C'] = np.where(df['B']>0,0,df.groupby(np.where(df['B']<0,0,df['B'])).cumcount()+1)

输出:

         A      B  C
0  5889.25  738.0  0
1  5896.50   49.0  0
2  5897.50  130.0  0
3  5899.50 -266.0  1
4  5903.75 -126.0  2
5  5903.75 -512.0  3
6  5898.75 -141.0  4
7  5897.50 -303.0  5
8  5895.00 -107.0  6
9  5893.25   27.0  0

如果要为每个正数创建序列,可以编写函数

count = 0
def count_neg(x):
    global count
    if x < 0:
        count+=1
    else :
        count = 0 
    return count
df['C'] = df['B'].apply(count_neg)

输出:

        A      B  C
0  5889.25 -738.0  1
1  5896.50  -49.0  2
2  5897.50  130.0  0
3  5899.50 -266.0  1
4  5903.75 -126.0  2
5  5903.75 -512.0  3
6  5898.75 -141.0  4
7  5897.50 -303.0  5
8  5895.00 -107.0  6
9  5893.25   27.0  0