熊猫:从SettingWithCopyWarning到loc和iloc

时间:2019-01-11 10:14:00

标签: python pandas

我试图做:

input1['Signature_Fixed'] = 'NONE' 
i = 0

for row in input1['Signature']:
  if (row == 'Competitor'):
    input1['Signature_Fixed'][i] = input1['brand'][i]
  else:
    input1['Signature_Fixed'][i] = input1['Signature'][i]
  i = i + 1

当我处理1K行时,它可以工作,但是我有SettingWithCopyWarning,那么当我处理2M行时,则无法工作。

您能帮我解决这个问题,或者用loc / iloc进行转换吗?

1 个答案:

答案 0 :(得分:0)

input1['Signature_Fixed'][i]表示链接索引,在官方文档中为explicitly discouraged。尽可能避免。

在这种情况下,您可以使用pd.Series.mask来完全避免for循环:

bool_mask = df['Signature'] == 'Competitor'
df['Signature_Fixed'] = df['Signature'].mask(bool_mask, df['brand'])

语法上的想法是对 vectorized 方式的列进行操作,而不是对行循环进行操作。