【问题标题】:Stripping Pandas DataFrame on specific conditions在特定条件下剥离 Pandas DataFrame
【发布时间】:2017-08-06 15:28:57
【问题描述】:

我有一个看起来像这样的 Pandas 数据框:

import numpy as np
raw_data = {'Series_Date':['2017-03-10','2017-03-13','2017-03-14','2017-03-15'],'SP':[35.6,56.7,np.nan,-9.2],'1M':[-7.8,np.nan,56,-3.4],'3M':[24,-31,53,np.nan]}
import pandas as pd
df = pd.DataFrame(raw_data,columns=['Series_Date','SP','1M','3M'])
print df

我只想在这个 DataFrame 中的某些列上运行测试,这个列表中的所有列名:

check = {'1M','SP'}
print check

我想要我的 DataFrame df 的精简版本,例如它仅包含列 Series_Date,其中列表中的列中的值“检查”是 NaN 或负数。

在这种情况下,输出 df 将因此包含所有 Series_Date,其中 1M 或 SP 列中的值为负数或 NaN。

您能帮我解决这样的问题吗?非常感谢提前

【问题讨论】:

    标签: python python-2.7 pandas numpy


    【解决方案1】:

    更新:

    In [18]: df.loc[df.loc[:, check].fillna(-1).lt(0).any(1), 'Series_Date']
    Out[18]:
    0    2017-03-10
    1    2017-03-13
    2    2017-03-14
    3    2017-03-15
    Name: Series_Date, dtype: object
    

    旧答案:

    In [7]: df.loc[:, check]
    Out[7]:
         SP    1M
    0  35.6  -7.8
    1  56.7   NaN
    2   NaN  56.0
    3  -9.2  -3.4
    

    或者你可以使用df.columns.isin()方法

    In [6]: df.loc[:, df.columns.isin(check)]
    Out[6]:
         SP    1M
    0  35.6  -7.8
    1  56.7   NaN
    2   NaN  56.0
    3  -9.2  -3.4
    

    【讨论】:

    • 我想要系列日期列,其中 SP 和 1M 列中的值为 NaN 或负数。这个答案只返回整个 DF。
    【解决方案2】:

    使用智能索引:

    import numpy as np
    # Choose the columns of interest
    cols = df[list(check)]
    # Evaluate both conditions:
    cond = ((np.isnan(cols)) | (cols < 0))
    # Use boolean indexing to select the right rows
    df[cond.any(axis=1)]['Series_Date']    
    #0    2017-03-10
    #1    2017-03-13
    #2    2017-03-14
    #3    2017-03-15
    #Name: Series_Date, dtype: object
    

    【讨论】:

    • 我想要系列日期列,其中 SP 和 1M 列中的值为 NaN 或负数。这个答案只返回整个 DF
    • 抱歉,忽略了您问题的第二部分。请参阅更新的答案。顺便说一句,在您的示例中,整个 DF 就是答案。
    猜你喜欢
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多