如何在熊猫数据框中的空行之后删除所有行

时间:2020-08-17 03:15:59

标签: python excel pandas dataframe data-cleaning

我一直在尝试用新的方式使用户弄乱数据表...

因此,我尝试将大量的Excel Sheet数据导入数据库。其中有很多垃圾数据在实际工作表的边缘附近等待。我很确定我可以控制列-应该是17,而不是偶然遇到的78。但是现在我有了一个新的。

我的数据行结束,有一堆空行,然后突然……垃圾。当然,它被导入到数据帧中,虽然我告诉它删除空行或包含4个或更多null值的行,但这些行塞满了数据。只是垃圾数据。

所以我在想,一旦我找到一个空行,就应该转储其余的行。我不确定是否有其他标准可以消除垃圾邮件。当然,我使用的是dropna,但我认为这没有用。

这是我在17之后删除列的代码:

if len(dataf.columns) > 18:
        extra = len(dataf.columns) - 1
        for i in range(extra, 17, -1):
            dataf.drop(dataf.columns[i], axis = 1, inplace = True)#drop columns accidentally named and higher than FILED DATE

所以我在想类似的行。我需要空行的索引。然后我得到了dataf.rows的len并删除了多余的部分。然后对dropna进行适当的处​​理-有时在某些行中有人忘记删除所有内容,并留下一个零散的值。

这是有效的解决方案吗?有没有一种简单的方法来查找第一个空行的索引?

2 个答案:

答案 0 :(得分:0)

我认为这是一种有效的方法

import pandas as pd 
df = pd.DataFrame()

for i , r in df.iterrows():
   if pd.isnull(r).any():
      df.drop(i,inplace = True)

首先,它对行进行迭代,并检查是否有任何行为空(如果为空),那么我们将在该特定索引中提取值

答案 1 :(得分:0)

这是在特定列中第一个空值之前/之后删除行的方法(不使用iterrows()

import pandas as pd

# create data frame
df = pd.DataFrame(
    {'direction': ['north', 'east', 'south', 'west', 'up', 'down'],
     'amount': [10, 20, 30, None, 100, 200]})

# is current value None? (False -> 0; True -> 1)
df['empty?'] = df['amount'].isna()

# calculate cumulative sum; will be >= 0 at/after FIRST bad value
df['accum_empty'] = df['empty?'].cumsum()

# boolean mask, for update
mask = df['accum_empty'] == 0

# enable (un-comment) following line to delete
#df = df.loc[mask]

print(df)

  direction  amount  empty?  accum_empty
0     north    10.0   False            0
1      east    20.0   False            0
2     south    30.0   False            0
3      west     NaN    True            1
4        up   100.0   False            1
5      down   200.0   False            1

更新:

您可能希望将第一行上/后的行放所有空值:

# create another data frame
df = pd.DataFrame(
    {'direction': ['north', 'east', 'south', None, 'up', 'down'],
     'amount': [10, 20, 30, None, 100, 200]})

# does the whole row consist of `None`
df['row_is_none'] = df.isna().all(axis=1)

# calculate the cumulative sum of the new column
df['row_is_non_accum'] = df['row_is_none'].cumsum()

# create boolean mask and perform drop (not shown to save space)

print(df)
  direction  amount  row_is_none  row_is_non_accum
0     north    10.0        False                 0
1      east    20.0        False                 0
2     south    30.0        False                 0
3      None     NaN         True                 1
4        up   100.0        False                 1
5      down   200.0        False                 1