在特定条件下剥离Pandas DataFrame

时间:2017-03-15 18:05:25

标签: python python-2.7 pandas numpy

我有一个看起来像这样的Pandas Dataframe:

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列,其中列表中的列值为' check'是NaNs还是负面的。

在这种情况下,输出df将具有所有Seri​​es_Date,其中1M或SP列中的值为负或NaN。

请问你能帮我解决这个问题吗?非常感谢提前

2 个答案:

答案 0 :(得分:2)

<强>更新

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

OLD回答:

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

答案 1 :(得分:1)

使用智能索引:

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