空行后如何跳过数据帧的其余部分?

时间:2018-11-12 23:25:01

标签: python pandas

以下例程检索数据文件。

wget.download("https://www.aaii.com/files/surveys/sentiment.xls", "C:/temp/sentiment.xls")
df = pd.read_excel("C:/temp/sentiment.xls", sheet_name = "SENTIMENT", skiprows=3, parse_dates=['Date'], date_format='%m-%d-%y', index_col ='Date')

前三个数据行不完整,因此我可以像df [3:]

那样将它们切开

大约在第1640行有一个空白行。我希望在该行之后跳过文件的其余部分。我试图像这样找到那条线并获取它的索引,以便可以做另外一个切片,但是我得到了nan作为索引值。

df[df.isnull().all(1)].index.values[0]

如何找到该行并跳过文件的其余部分?

1 个答案:

答案 0 :(得分:1)

我认为您在此文件中有两个nan行问题:

  1. 标题之后的第一行已经是一个空行,导致一个nan索引。
  2. 此处发布信息的原因,空白行表示您感兴趣的数据的结尾。

首先按照您的操作导入数据:

df = pd.read_excel("sentiment.xls", sheet_name = "SENTIMENT", skiprows=3, parse_dates=['Date'], date_format='%m-%d-%y', index_col ='Date')

df.head()
                     Bullish  Neutral  Bearish   ...      High     Low   Close
Date                                             ...                          
NaN                      NaN      NaN      NaN   ...       NaN     NaN     NaN
1987-06-26 00:00:00      NaN      NaN      NaN   ...       NaN     NaN     NaN
1987-07-17 00:00:00      NaN      NaN      NaN   ...    314.59  307.63  314.59
1987-07-24 00:00:00     0.36     0.50     0.14   ...    311.39  307.81  309.27
1987-07-31 00:00:00     0.26     0.48     0.26   ...    318.66  310.65  318.66

然后删除第一个空行(nan-索引),问题1

df = df[1:]

df.head()
                     Bullish  Neutral  Bearish   ...      High     Low   Close
Date                                             ...                          
1987-06-26 00:00:00      NaN      NaN      NaN   ...       NaN     NaN     NaN
1987-07-17 00:00:00      NaN      NaN      NaN   ...    314.59  307.63  314.59
1987-07-24 00:00:00     0.36     0.50     0.14   ...    311.39  307.81  309.27
1987-07-31 00:00:00     0.26     0.48     0.26   ...    318.66  310.65  318.66
1987-08-07 00:00:00     0.56     0.15     0.29   ...    323.00  316.23  323.00

现在您要为第一个nan-索引第2个问题之前的所有行建立索引。
想法:为所有nan-索引创建一个带有True条目的布尔数组,将其转换为整数并建立累加和。现在,您有了一个数组,对于所有想要的数据,该数组为0,从任何不需要的行开始直到结尾都为> 0。
针对0测试的结果为您的数据返回布尔索引:

data_idx = df.index.isna().astype(int).cumsum() == 0

应用于您的数据框:

df[data_idx]
                      Bullish   Neutral   ...         Low    Close
Date                                      ...                     
1987-06-26 00:00:00       NaN       NaN   ...         NaN      NaN
1987-07-17 00:00:00       NaN       NaN   ...      307.63   314.59
1987-07-24 00:00:00  0.360000  0.500000   ...      307.81   309.27
1987-07-31 00:00:00  0.260000  0.480000   ...      310.65   318.66
1987-08-07 00:00:00  0.560000  0.150000   ...      316.23   323.00
                      ...       ...   ...         ...      ...
2018-10-11 00:00:00  0.306061  0.339394   ...     2784.86  2785.68
2018-10-18 00:00:00  0.339350  0.310469   ...     2710.51  2809.21
2018-10-25 00:00:00  0.279693  0.310345   ...     2651.89  2656.10
2018-11-01 00:00:00  0.379310  0.275862   ...     2603.54  2711.74
2018-11-08 00:00:00  0.412844  0.275229   ...     2700.44  2813.89

[1635 rows x 12 columns]