簡體   English   中英

根據另一列(Pandas)中的條件替換每行中的列中的內容

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

我是Pandas的新手。我想根據每行中的月份計數器列替換列中的數字

在MONTH_COUNTER上的字符串值上的交叉(PUT X)

如果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

我的Dataframe有數百萬行這是一個示例(二進制活動)

  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)

print 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

答案在這里:

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

我認為應該這樣做

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

謝謝大家這對我也有用

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM