根据另一列中的条件替换每行中列中的内容(Pandas)
Replacing contents in Columns in each row depending on condition in another column(Pandas)
我是新手 Pandas.I 想根据每行中的月份计数器列替换列中的数字
根据 MONTH_COUNTER
在列值上交叉(放置 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 有数百万行这是一个示例(二进制 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
这是我的两个函数(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
我觉得应该这样
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
答案在这里:
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
谢谢你这一切对我也有用
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
我是新手 Pandas.I 想根据每行中的月份计数器列替换列中的数字
根据 MONTH_COUNTER
在列值上交叉(放置 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 有数百万行这是一个示例(二进制 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
这是我的两个函数(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
我觉得应该这样
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
答案在这里:
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
谢谢你这一切对我也有用
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