我正在尝试在多列上应用if-then语句,然后将if-then语句的结果输出到新列。我的数据如下:
AtoB BtoC CtoD
240 600 1000
-30 540 540
50 -50 0
0 0 -10
我想要的输出是:
AtoB_C BtoC_C CtoD_C
C C C
E C C
C E S
S S E
这个想法是if-then语句的结果存储在这些新变量中,原始变量仍然存在。要评估的变量位于“结果”列表中,输出变量(此时没有任何内容)位于“Result_Correct”列表中我的代码是:
Result = ['AtoB','BtoC','CtoD']
Result_Correct = ['AtoB_C','BtoC_C','CtoD_C']
for row in DF[Result]:
if row > 0:
[Result_Correct].append('c')
elif row == 0:
[Result_Correct].append('s')
else:
[Result_Correct].append('e')
DF[Result_Correct] = [Result_Correct]
当我尝试运行此功能时,我收到消息“'>' 'str'和'int'实例之间不支持。我怎样才能做到这一点?谢谢!
答案 0 :(得分:1)
您可以在DataFrame
构造函数中使用双numpy.where
:
Result = ['AtoB','BtoC','CtoD']
#new column names
Result_Correct = ['AtoB_C','BtoC_C','CtoD_C']
#filter coumns by list Result if necessary
df = df[Result]
df = pd.DataFrame(np.where(df>0, 'C',
np.where(df==0, 'S', 'E')), index=df.index, columns=Result_Correct)
print (df)
AtoB_C BtoC_C CtoD_C
0 C C C
1 E C C
2 C E S
3 S S E
另一种解决方案:
Result = ['AtoB','BtoC','CtoD']
Result_Correct = ['AtoB_C','BtoC_C','CtoD_C']
df = df[Result]
d = {1:'C', 0:'S', -1:'E'}
df = pd.DataFrame(np.sign(df.values), index=df.index, columns=Result_Correct).replace(d)
print (df)
AtoB_C BtoC_C CtoD_C
0 C C C
1 E C C
2 C E S
3 S S E
它使用函数numpy sign,然后dict
使用print (np.sign(df.values))
[[ 1 1 1]
[-1 1 1]
[ 1 -1 0]
[ 0 0 -1]]
:
df = df.astype(float)
编辑:
如果获得:
'>' ' str'的实例之间不支持和' int'
这意味着一些int值是字符串,然后使用:
NaN
或者还有另一个问题,一些糟糕的非数值。然后需要replace
将这些值替换为0
,然后将其替换为df = df.apply(pd.to_numeric, errors='coerce').fillna(0)
之类的标量to_numeric
:
Camera.Size size=getBestPreviewSize(display.getHeight(), display.getWidth(), parameters);
parameters.setPreviewSize(size.width, size.height);
parameters.setPictureSize(size.width, size.height);
this.camera.setParameters(parameters);