问题描述
我一直在尝试用新的方式使用户弄乱数据表...
因此,我尝试将大量的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进行适当的处理-有时在某些行中有人忘记删除所有内容,并留下一个零散的值。
这是有效的解决方案吗?有没有一种简单的方法来查找第一个空行的索引?
解决方法
我认为这是一种有效的方法
import pandas as pd
df = pd.DataFrame()
for i,r in df.iterrows():
if pd.isnull(r).any():
df.drop(i,inplace = True)
首先,它对行进行迭代,并检查是否有任何行为空(如果为空),那么我们将在该特定索引中提取值
,这是在特定列中第一个空值之前/之后删除行的方法(不使用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',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