2017-07-22 32 views
1

我是新来Pandas.I想在列取决于一个月计数器列各行中更换号码各行中的另一列替换列的内容取决于条件(熊猫)

CROSS(PUT X)在列数值随着MONTH_COUNTER

IF MONTH_COUNTER 1没有越过任何列:

2 CROSS DEC,JAN: 
3 CROSS DEC,JAN,FEB: 
4 CROSS DEC,JAN,FEB,MARCH: 
5 CROSS DEC,JAN,FEB,MARCH,APRIL: 
6 CROSS DEC,JAN,FEB,MARCH,APRIL 

我的数据帧具有数百万行的这是一个示例(二进制活动)

DEC JAN FEB MARCH APRIL MAY Month_Counter 
0 0 0 0  1  0 1    3 
1 0 0 1  1  0 1    3 
2 0 0 0  0  1 1    5 
3 1 0 0  0  1 1    1 
4 0 1 1  1  1 1    1 
5 0 1 1  1  1 0    2 
6 1 1 0  0  0 0    1 
7 0 0 0  0  0 1    6 
8 1 0 0  1  0 0    1 
9 0 0 0  1  1 0    4 

这些是我的两个函数(Stike + Strike1),但它们都跨越整整一个月,当我调用该函数

def Strike(df): 
df['Month_Counter']= df['Month_Counter'].astype(int) 
m=df['Month_Counter'].tolist() 
n=[i for i,val in enumerate(m)] 
k= pd.Series([m[i] for i in n]) 
s=(k.size)-1 
for i in range(df.shape[0]): 
    for j in range(0,s): 
     if k[j]>1: 
      df.iloc[:,0:k[j]]=df.replace(df.iloc[:,0:k[j]],'X') 
return df 

def Strike1(df): 
Month_Counter = df['Month_Counter'].tolist() 

for i in Month_Counter: 
    if i > 1 : 
     df=df.replace(df.iloc[:,0:i],'X') 
return df 
df1=Strike(df1) 

打印df1.head(20).to_string()

他们生产他下面的结果,请帮助,我哪里出错了?

DEC JAN FEB MARCH APRIL MAY Month_Counter 
0 X X X  X  X X    3 
1 X X X  X  X X    3 
2 X X X  X  X X    5 
3 X X X  X  X X    1 
4 X X X  X  X X    1 
5 X X X  X  X X    2 
6 X X X  X  X X    1 
7 X X X  X  X X    6 
8 X X X  X  X X    1 
9 X X X  X  X X    4 

这是输出我想

DEC JAN FEB MARCH APRIL MAY Month_Counter 
0 X X X  1  0 1    3 
1 X X X  1  0 1    3 
2 X X X  X  X 1    5 
3 1 0 0  0  1 1    1 
4 0 1 1  1  1 1    1 
5 X X 1  1  1 0    2 
6 1 1 0  0  0 0    1 
7 X X X  X  X X    6 
8 1 0 0  1  0 0    1 
9 X X X  X  1 0    4 

回答

1

我想这应该这样做

df1 = pd.DataFrame({'DEC':[0,1,0,0,0,1,1,0,0,1],'JAN':[0,1,1,0,0,1,1,1,0,0],'FEB':[0,1,0,0,1,1,1,1,0,1],'MAR':[0,1,0,0,1,1,1,1,0,1],"Month_Counter":[3,3,2,1,1,2,1,2,1,3]}) 


for i in range(len(df1["Month_Counter"])): 
    for j in range(df1.loc[i, "Month_Counter"]): 
     if int(df1.loc[i,"Month_Counter"]) > 1: 
      df1.iloc[i,j]=str(df1.iloc[i,j]) 
      df1.iloc[i, j]="X" 

DEC FEB JAN MAR Month_Counter 
0 X X X 0    3 
1 X X X 1    3 
2 X X 1 0    2 
3 0 0 0 0    1 
4 0 1 0 1    1 
5 X X 1 1    2 
6 1 1 1 1    1 
7 X X 1 1    2 
8 0 0 0 0    1 
9 X X X 1    3 
+0

谢谢,我也希望计算连续零的个数在过了那个月之后,我试图用移位功能失败,就像在第3行,3个零,第6行,第2个零,第8行中一样,2个零点 –

1

答案就在这里:

for i in range(0,len(df.columns)): 
    df.iloc[:,i] = np.where(df['Month_Counter'] >= i + 1, 'X', df.iloc[:,i]) 

前:

APR DEC FEB JAN MAR MAY Month_Counter 
0 0 0 0 0 1 1    3 
1 0 0 1 0 1 1    3 
2 1 0 0 0 0 1    5 
3 1 1 0 0 0 1    1 
4 1 0 1 1 1 1    1 
5 1 0 1 1 1 0    2 
6 0 1 0 1 0 0    1 
7 0 0 0 0 0 1    6 
8 0 1 0 0 1 0    1 
9 1 0 0 0 1 0    4 

后:

DEC FEB JAN MAR MAY  Month_Counter 
0 X X X 0 1 1    3 
1 X X X 0 1 1    3 
2 X X X X X 1    5 
3 1 1 0 0 0 1    1 
4 1 0 1 1 1 1    1 
5 X X 1 1 1 0    2 
6 0 1 0 1 0 0    1 
7 X X X X X X    6 
8 0 1 0 0 1 0    1 
9 X X X X 1 0    4 
+0

谢谢,我还想计算跨越那个月后连续连续的零的数量,我试图使用移位函数我失败,就像第3行,3个零,第6行,第2个零,第8行2个零 –

0

谢谢大家,这也为我工作

def Strike(df): 
df['Month_Counter']= df['Month_Counter'].astype(int) 
m=df['Month_Counter'].tolist() 
n=[i for i,val in enumerate(m)] 
k= pd.Series([m[i] for i in n]) 
for i in range(df.shape[0]): 
    if k[i]>1: 
     df.loc[[i],0:k[i]]=df.replace(df.iloc[:,0:k[i]],'X') 
return df