【问题标题】:Pandas isin() gives ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all() [duplicate]Pandas isin() 给出 ValueError:Series 的真值是不明确的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all() [重复]
【发布时间】:2021-06-17 11:15:39
【问题描述】:

我想检查我正在使用的日期是否已经存在于 DataFrame 中。如果是,我想将另一个 DataFrame 中的值添加到该日期行的计数列中。我不,我只想将新行连接到 DataFrame。

我的数据框如下所示:

结果_df:

       date     count
0 '2021-01-01'    10           
1 '2021-01-02'    13       
...

temp_df:

      date      count          
0 '2021-01-02'    8    

我使用的代码如下:

date = '2021-01-02'
if result_df.loc[result_df['date'].isin([date])].any():
   result_df.loc[result_df['date'] == date, 'count'] += temp_df['count']
else:
   result_df = pd.concat([result_df, temp_df], ignore_index=True)

因此出现以下错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

请帮我解决这个问题。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    具体到您正在尝试的内容,您可以使用以下方法获取匹配日期:

    result_df['date'].isin(temp_df['date'])
    0    False
    1     True
    Name: date, dtype: bool
    

    但是由于您想在 date 匹配时从两个 df 中添加 count,因此请使用 df.merge() 创建具有必要匹配的数据框,然后从“右侧”的 df 中添加计数:

    merged = result_df.merge(temp_df, how='left', on='date', suffixes=('', '_y')).fillna(0)
    result_df['count'] += merged['count_y']
    

    请注意,这将匹配每个 date,这在两个 df 中都很常见,而不仅仅是一个日期值。因此,您可以一次性为所有匹配的日期temp_df 执行此操作。

    fillna 用于为counts 填入0,而temp_df 中缺少这些@s。在merged 数据框中,它有_y 后缀:

               date  count  count_y
    0  '2021-01-01'     10      0.0
    1  '2021-01-02'     13      8.0
    

    最终result_df 是:

               date  count
    0  '2021-01-01'   10.0
    1  '2021-01-02'   21.0
    

    对于您遇到的错误,请参阅此问题 - Truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

    【讨论】:

    【解决方案2】:

    如果你只匹配一个日期,比如示例数据,你可以试试:

    date = '2021-01-02'
    result_df.loc[result_df['date'].isin([date]), 'count'] += temp_df.loc[temp_df['date'] == date, 'count'].values
    

    结果:

    print(result_df)
    
             date  count
    0  2021-01-01     10
    1  2021-01-02     21
    

    您的代码出现错误的原因是 Python if 语句无法处理包含多个值的 Pandas 系列。因为您的代码 .isin() 实际上返回一个布尔系列,其中 2 个 True/False 值对应于 2 个日期的 2 行的检查结果。因此,错误。您必须将 Python if 语句的使用替换为仅 Pandas / numpy 代码才能正确处理它。

    【讨论】:

    • 感谢您的解释。
    • @KatsiarynaShkirych 很高兴为您提供帮助!请考虑点击左侧的✓ 接受答案(见How to accept SO answers
    【解决方案3】:

    如果我理解正确,您想检查日期是否在列中。可以这样做:

    date = '2021-01-02'
    if date in result_df['date'].values:
       result_df.loc[result_df['date'] == date, 'count'] += temp_df['count']
    else:
       result_df = pd.concat([result_df, temp_df], ignore_index=True)
    

    【讨论】:

    • 谢谢,帮了大忙,我一定会试试的。
    猜你喜欢
    • 1970-01-01
    • 2022-12-29
    • 2016-12-01
    • 2021-03-21
    • 2021-08-14
    • 2019-01-24
    • 2020-05-27
    • 2018-07-09
    • 2021-05-27
    相关资源
    最近更新 更多