【问题标题】:check if values of a series appear in same row of a different df检查系列的值是否出现在不同df的同一行中
【发布时间】:2021-05-28 13:07:45
【问题描述】:

我试图找出一个系列的值是否出现在另一个 df 中。这是一个简单的例子:

将熊猫导入为 pd

s=pd.Series([1.1,2.2])
df=pd.DataFrame()
df['a']=[1.1,3.3]
df['b']=[4.4,5.5]

我想检查任何列的 df 中是否存在“1.1”,如果存在则获取值 True。我将其用作布尔掩码,以便我可以将其用于另一个 df 的选择标准。

我试过了:

>>> s.isin(df)             
0    False
1    False

还有:

>>> s.values == df   
       a      b
0   True  False
1  False  False

看起来这是在正确的轨道上,所以我尝试从中派生一个掩码:

>>> np.sum(s.values == df, axis=1) >0
0     True
1    False
dtype: bool

看起来不错,但是当我在我的实际数据上尝试这个时,我得到了一个不寻常的错误:

我只是尝试执行以下 3 个打印语句,然后我得到了:

print(df)
print(series)
print(np.sum([series.values==df], axis=1) >0)

                  3rd        2nd        1st
Date
1995-01-03        NaN        NaN        NaN
1995-01-04        NaN        NaN        NaN
1995-01-05        NaN        NaN        NaN
1995-01-06        NaN        NaN        NaN
1995-01-09        NaN        NaN        NaN
...               ...        ...        ...
2021-05-19  19.531345  16.888084  15.596825
2021-05-20  19.422386  16.571087  14.174667
2021-05-21  19.283871  16.112516  14.281031
2021-05-24  19.167412  15.726680  14.438169
2021-05-25  19.157773  15.488945  14.616952

[6815 rows x 3 columns]
Date
1995-01-03          NaN
1995-01-04          NaN
1995-01-05          NaN
1995-01-06          NaN
1995-01-09          NaN
                ...
2021-05-19    14.016911
2021-05-20    14.174667
2021-05-21    14.281031
2021-05-24    14.438169
2021-05-25    14.616952
Name: series_name, Length: 6815, dtype: float64
CRITICAL:root:Global try/catch caught an unhandled exception
ERROR:root:Unable to coerce to Series, length must be 3: given 6815
ValueError: Unable to coerce to Series, length must be 3: given 6815

系列和数据框和系列的大小似乎是正确的,并且系列中的最后 4 个值(以 14.616952 结尾)与数据框最后一列相匹配,因此我希望掩码此时具有“真”值?

如果有人能诊断出这个错误,那真的很有帮助吗?非常感谢

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    使用 Pandas 的.isin 方法,如下所示。简单的解释是,针对系列在 DataFrame 上应用 isin 函数,然后在 axis=1 上应用 any 函数,以确保以 True 或 False 形式获得整行的预期输出。

    df.isin(series).any(axis=1)
    

    输出如下:

    0     True
    1    False
    dtype: bool
    

    【讨论】:

      【解决方案2】:

      你的命令周围有一个额外的[]:

      print(df)
      print(series)
      print(np.sum([series.values==df], axis=1) >0)
                   ^ remove this     ^ and this
      

      也可以考虑all:

      (series.values==df).all(axis=1)
      

      【讨论】:

        猜你喜欢
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-09
        • 2021-08-20
        相关资源
        最近更新 更多