I am new to Pandas.I want to replace the numbers in columns depending on month counter column in each row
CROSS (PUT X) ON THE COLUMN VALUES DEPENDING ON MONTH_COUNTER
IF MONTH_COUNTER IS 1 DON'T CROSS ANY COLUMN:
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
My Dataframe has millions of rows This is a sample (Binary Activity)
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
These are my two functions(Stike+Strike1) but they all cross all month when i call the function
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)
print df1.head(20).to_string()
they produce he following results, please help,where do i go wrong??
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
This is the output I want
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
The answer is here:
for i in range(0,len(df.columns)):
df.iloc[:,i] = np.where(df['Month_Counter'] >= i + 1, 'X', df.iloc[:,i])
Before:
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
After:
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
I think this should do it
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
Thank you all this also worked for me
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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.