基于另一列/ TypeError更新pandas dataframe列:字符串索引必须是整数

时间:2018-03-16 10:30:15

标签: pandas dataframe lambda types

我正在使用另一列的值更新列,如果它的值为零

dft = pd.DataFrame(
                        np.array([
                                    ['MAXESSUS', 0], ['BLOOMBERG', 'CORP'], ['BROKER_TEC', 'GOVT'], ['MAXESSUS', 0]
                                ]), columns=['market', 'rbc_security_type1']
                  )
dft

      market    rbc_security_type1
0   MAXESSUS    0
1   BLOOMBERG   CORP
2   BROKER_TEC  GOVT
3   MAXESSUS    0

这是我的功能

dft['rbc_security_type1'].apply(
                                    lambda col_value: col_value['rbc_security_type1'] if col_value['rbc_security_type1'] == 0 
                                                                                    else col_value['rbc_security_type1']
                               )
  

所需的输出

dft


      market    rbc_security_type1
0   MAXESSUS    MAXESSUS
1   BLOOMBERG   CORP
2   BROKER_TEC  GOVT
3   MAXESSUS    MAXESSUS
  

我收到此错误:   TypeError:字符串索引必须是整数

     

rbc_security_type1是否包含字符串和整数的问题   需要更改列类型的转换吗?

1 个答案:

答案 0 :(得分:1)

我认为需要按字符串0进行比较,因为数字已转换为字符串,然后使用locnumpy.wheremask

#if mixed values - numeric with strings compare by numeric
#mask = dft['rbc_security_type1'] == 0
mask = dft['rbc_security_type1'] == '0'
dft.loc[mask, 'rbc_security_type1'] = dft['market']
dft['rbc_security_type1'] = np.where(mask, dft['market'], dft['rbc_security_type1'])
dft['rbc_security_type1'] = dft['rbc_security_type1'].mask(mask, dft['market'])

print (dft)
       market rbc_security_type1
0    MAXESSUS           MAXESSUS
1   BLOOMBERG               CORP
2  BROKER_TEC               GOVT
3    MAXESSUS           MAXESSUS

明细:用于检查数字是否为字符串:

print (dft['rbc_security_type1'].apply(type))
0    <class 'str'>
1    <class 'str'>
2    <class 'str'>
3    <class 'str'>
Name: rbc_security_type1, dtype: object