[英]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.