我有一个看起来像这样的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将具有所有Series_Date,其中1M或SP列中的值为负或NaN。
请问你能帮我解决这个问题吗?非常感谢提前
答案 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