ValueError :。使用a.empty,a.bool(),a.item(),a.any()或a.all()。在调用函数时

时间:2019-01-24 05:01:28

标签: python pandas dataframe

我正在使用CSV文件作为输入并生成JSON格式的文件以馈入kafka主题

df = pd.read_csv(csv_file, delimiter=",",
                 dtype={'E': 'S10', 'C': 'S10', 'Date': 'S10', 'TimeCode': 'S10', 
                         'Workrule': 'S10'})

common.time_calc(df) #time_calc is the function from a
df = df.drop(['Workrule'], axis=1)

关于我拥有的功能

def time_calc(df_entry):
    if (df_entry['TimeCode'] == 'R') and (df_entry['Workrule'] == 'C'):
        df_entry['TimeCode'] = 'A'
    if df_entry['TimeCode'] in ['O', 'L']:
        df_entry['TimeCode'] = 'O'

我得到

  

ValueError:系列的真值不明确。使用空   a.bool(),a.item(),a.any()或a.all()。

我尝试将代码修改为

if (df_entry['TimeCode'] == 'R') & (df_entry['Workrule'] == 'C'):
        df_entry['TimeCode'] = 'A'

但仍然出现相同的错误。

添加了以下内容,现在可以发布。谢谢!

json_data = df.to_json(orient='records')
json_input = '{"value":' + json_data + '}'
decodedJson = json.loads(json_input) 
for entry in decodedJson['value']:
 common.time_calc(entry)
 del entry['Workrule']

2 个答案:

答案 0 :(得分:0)

您的函数time_calcDataFrame作为参数。在df_entry['TimeCode'] == 'R'部分中,您实际上是在将整列与标量值进行比较时计算出一个序列。

对此使用逻辑and时,python会尝试计算与Series等效的boolean,这会引发异常。您实际上打算做的是使用向量运算或在行上循环。

可以(不经过测试)固定代码的示例:

def time_calc(df):
    df.loc[df['TimeCode'] == 'R' & df['Workrule'] == 'C', 'TimeCode'] = 'A'
    df.loc[df['TimeCode'].isin(['O', 'L']), 'TimeCode'] = 'O'

答案 1 :(得分:0)

您正在将整个列与单个值df_entry['TimeCode'] =='R'进行比较。您需要逐行进行迭代以比较单个列的值,或者更好地使用np.where

def time_calc(df_entry):
    df_entry['TimeCode'] = np.where((df_entry['TimeCode'] == 'R') and (df_entry['Workrule'] == 'C'), 'A', df_entry['TimeCode'])
    df_entry['TimeCode'] = np.where(df_entry['TimeCode'] in ['O','L'], 'O', df_entry['TimeCode'])