我在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
答案 0 :(得分:5)
您可以使用np.where
查找否定值,然后使用groupby
和cumcount()+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