简体   繁体   中英

Replacing contents in Columns in each row depending on condition in another column(Pandas)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM