【问题标题】:Python Error: truth value of Series is ambigious in if-statementPython 错误:系列的真值在 if 语句中不明确
【发布时间】:2019-10-10 12:11:31
【问题描述】:

我在每天比较两个数据帧的值时遇到问题。 数据框包含 df1 = 每天的最低温度值和 df2 = 每天的最高温度值。

dfs 是这样的(TS_TIMESTAMP 是索引列):

df1:

> TS_TIMESTAMP              Date        TREND_VALUE             
> 2019-04-03 18:48:10.970  2019-04-02   8.340000        
> 2019-04-04 16:49:23.320  2019-04-03   7.840000           
> 2019-04-05 13:19:33.550  2019-04-04   7.480000 

df2:

> TS_TIMESTAMP              Date        TREND_VALUE             
> 2019-04-03 18:48:10.970  2019-04-02   19.340000        
> 2019-04-04 16:49:23.320  2019-04-03   18.840000          
> 2019-04-05 13:19:33.550  2019-04-04   18.480000   

我想用一个函数计算每天 max_value 和 min_value 之间的差异(简单地用许多不同的文件运行计算)。

这是我想出的:

def temp_diff (df1, df2):
    for row in df1, df2:
        if df1.Date == df2.Date:
            print (df2.TREND_VALUE - df1.TREND_VALUE)

如果我运行这个函数,我会得到这个 if 语句的错误消息: ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

我不确定如何适当地更改我的 def。

感谢您的帮助!

【问题讨论】:

    标签: python-3.x pandas for-loop if-statement


    【解决方案1】:

    假设您使用的是 all 条件,这将在 all df1['Date'] 和 df2['Date'] 中的值相等时打印。如果这就是你想要的,那就去吧:

    def temp_diff (df1, df2):
        for row in df1, df2:
            if (df1.Date == df2.Date).all():
                print (df1.TREND_VALUE - df2.TREND_VALUE)
    

    我有一种感觉,您想遍历每一行并检查 df1['Date']df2['Date'] 是否匹配,如果有,则打印差异,否则跳过该行。如果这是您想要的,请在 cmets 中告诉我,然后我将编辑此答案。

    import pandas as pd
    a = {'Date':['2019-04-02','2019-04-03','2019-04-04'],'Values':[8,7,4]}
    b = {'Date':['2019-04-02','2019-04-03','2019-04-04'],'Values':[19,18,17]}
    df_1 = pd.DataFrame(a)
    df_2 = pd.DataFrame(b)
    
    def temp_diff (df1, df2):
        for row in df1, df2:
            if (df1.Date == df2.Date).all():
                print (df1.Values - df2.Values)
    
    temp_diff(df_1,df_2)
    

    输出:

    0   -11
    1   -11
    2   -13
    Name: Values, dtype: int64
    

    编辑

    也许这就是你要找的东西?

    import pandas as pd
    import numpy as np
    a = {'Date':['2019-04-02','2019-04-03','2019-04-04'],'TREND_VALUE':[8,7,4]}
    b = {'Date':['2019-04-02','2019-04-03','2019-04-05'],'TREND_VALUE':[19,18,17]}
    df1 = pd.DataFrame(a)
    df2 = pd.DataFrame(b)
    df1['T_Amplitude'] = np.where((df1['Date'] == df2['Date']),df1['TREND_VALUE']-df2['TREND_VALUE'],np.nan)
    print(df_1)
    

    输出:

             Date  TREND_VALUE  T_Amplitude
    0  2019-04-02            8        -11.0
    1  2019-04-03            7        -11.0
    2  2019-04-04            4          NaN
    

    【讨论】:

    • 谢谢!您的代码示例非常有用!我会选择你的第一个选项!
    【解决方案2】:

    假设数据框中的行数相同,您只需将两列相减即可:

    df1.TREND_VALUE - df2.TREND_VALUE
    

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 2020-06-10
      • 2022-01-11
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      相关资源
      最近更新 更多