df
Date Factory I1 D1 I2 D2 I3 D3
0 1701 West 0 0 0 0 10 0
1 1701 East 39 0 83 15 3 15
2 1701 West 0 0 0 10 15 0
我想要这个:
If D2>I2 Then I3=I2+I3,D3=D2+D3,I2=D2=0
If D3>I3 Then I2=I2+I3,D2=D2+D3,I3=D3=0
否则没有变化
所以数据应该是这样的:
东风
Date Factory I1 D1 I2 D2 I3 D3
0 1701 West 0 0 0 0 10 0
1 1701 East 39 0 86 30 0 0
2 1701 West 0 0 0 0 15 10
我该怎么办?请帮忙~
你需要
mask
assign
:
m1 = df.D2 > df.I2
m2 = df.D3 > df.I3
df = df.mask(m1, df.assign(I3=df.I2+df.I3, D3=df.D2+df.D3, I2=0, D2=0))
df = df.mask(m2, df.assign(I2=df.I2+df.I3, D2=df.D2+df.D3, I3=0, D3=0))
print (df)
Date Factory I1 D1 I2 D2 I3 D3
0 1701 West 0 0 0 0 10 0
1 1701 East 39 0 86 30 0 0
2 1701 West 0 0 0 0 15 10
如果有带空格的列:
m1 = df.D2 > df.I2
m2 = df.D3 > df.I3
def f1(x):
df['I3']=df.I2+df.I3
df['D3']=df.D2+df.D3
df['I2'] = df['D2'] = 0
return df
def f2(x):
df['I2']=df.I2+df.I3
df['D2']=df.D2+df.D3
df['I3'] = df['D3'] = 0
return df
df = df.mask(m1, f1)
df = df.mask(m2, f2)
print (df)
Date Factory I1 D1 I2 D2 I3 D3
0 1701 West 0 0 10 0 0 0
1 1701 East 39 0 86 30 0 0
2 1701 West 0 0 15 10 0 0
或者,如果要使用assign
(I3
更改为I 3
(:
m1 = df['D2'] > df['I2']
m2 = df['D3'] > df['I 3']
d1 = {'I 3': lambda x: x['I2'] + x['I 3'],'D3':lambda x: x['D2']+x['D3'],'I2':0,'D2':0}
d2 = {'I2': lambda x: x['I2'] + x['I 3'],'D2':lambda x: x['D2']+x['D3'],'I3':0,'D3':0}
df = df.mask(m1, df.assign(**d1))
df = df.mask(m2, df.assign(**d2))
print (df)
Date Factory I1 D1 I2 D2 I 3 D3
0 1701 West 0 0 0 0 10 0
1 1701 East 39 0 86 30 3 0
2 1701 West 0 0 0 0 15 10
可以使用
易于理解的for
循环并处理每一行:
newvals = []
for i in range(len(df.index)):
ROW = df.iloc[i,:]
if ROW.D2>ROW.I2:
ROW.I3=ROW.I2+ROW.I3
ROW.D3=ROW.D2+ROW.D3
ROW.I2=ROW.D2=0
if ROW.D3>ROW.I3:
ROW.I2=ROW.I2+ROW.I3
ROW.D2=ROW.D2+ROW.D3
ROW.I3=ROW.D3=0
newvals.append(list(ROW))
newdf = pd.DataFrame(data=newvals, columns=df.columns)
print(newdf)
输出:
Date Factory I1 D1 I2 D2 I3 D3
0 1701 West 0 0 0 0 10 0
1 1701 East 39 0 86 30 0 0
2 1701 West 0 0 0 0 15 10