Pandas isin()给出ValueError:级数的真值是模糊的,使用.empty、.bool()、.item()、.any()或.all()[复制]

pkwftd7m  于 2023-09-29  发布在  其他
关注(0)|答案(3)|浏览(97)

此问题已在此处有答案

Truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()(14个回答)
两年前关门了。
我想检查我正在处理的日期是否已经存在于DataFrame中。如果是,我想将另一个DataFrame中的值添加到该日期行的计数列中。我不,我只是想把新的一行连接到 Dataframe 。
我的数据框看起来像这样:
result_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().

请帮我解决这个问题。

mw3dktmi

mw3dktmi1#

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

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用于为temp_df中缺少的count s输入0。在merged Dataframe 中,它有_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()

sq1bmfud

sq1bmfud2#

如果您只匹配一个日期(如示例数据),则可以尝试:

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 Series。因为你的.isin()代码实际上返回了一个布尔序列,其中有2个True/False值,对应于2个日期的2行的检查结果。因此,错误。你必须将Python if语句的使用替换为Pandas / numpy代码才能正确处理它。

wqnecbli

wqnecbli3#

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

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)

相关问题