Python 如何有条件地从数据帧中删除行

Python 如何有条件地从数据帧中删除行,python,pandas,dataframe,Python,Pandas,Dataframe,我的意图是将主数据帧分解为两个数据帧:一个是普通数据帧,另一个是包含异常值的数据帧,具体取决于NaN。下面的代码应该跨越数据帧长度,但实际上会引发异常 索引器错误:索引4超出大小为3的轴0的界限 print语句表明条件是正确的,但结果(当对范围(0,m-1)中的i使用时):是错误的,这可能是由于行的删除方式: import pandas as pd import numpy as np import matplotlib.pyplot as plt data = { 'apples':

我的意图是将主数据帧
分解为两个数据帧:一个是普通数据帧,另一个是包含异常值的数据帧,具体取决于NaN。下面的代码应该跨越数据帧长度,但实际上会引发异常
索引器错误:索引4超出大小为3的轴0的界限

print语句表明条件是正确的,但结果(当对范围(0,m-1)中的i使用
时):
是错误的,这可能是由于行的删除方式:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = {
    'apples': [3, 2, 0, np.nan, 2],
    'oranges': [0, 7, 7, 2, 7],
    'figs':[1, np.nan, 10, np.nan, 10]
}
purchases = pd.DataFrame(data)
purchases = pd.DataFrame(data, index=['June', 'Robert', 'Lily', 'David', 'Bob'])
# calculate the proportion of NaN per row
l = len(purchases.columns)
m = len(purchases)
n_nan=0
W= [0 for w in range(m)]
X = [i for i in range(0,m)]
for i in range(0,m):
    n_nan = purchases.iloc[i,:].isna().sum()
    print('row ',i,' number of NaN ',n_nan,' % of Nan ',n_nan*100/l)
    W[i]=n_nan*100/l
# Write code to divide the data into two subsets based on the number of missing
# values in each row.
# use https://www.shanelynn.ie/using-pandas-dataframe-creating-editing-viewing-data-in-python/
purchases_normal = purchases.copy()
purchases_outliers = purchases.copy()
print('purchases ')
print(purchases)
print('----------------------')
#
for j in range(0,m-0):
#    print('row ',j,' W = ',W[j])
    if W[j]> 20:
        print('at iteration ',j, ' going to drop from purchases_normal as W= ', W[j],' is > 20')
        purchases_normal.drop(purchases_normal.index[j], inplace=True)
    else:
        print('at iteration ',j, ' going to drop from purchases_outliers as W= ', W[j],' is < 20')
        purchases_outliers.drop(purchases_outliers.index[j], inplace=True)
print('purchases normal')
print(purchases_normal)
print('------')
print('purchases outliers')
print(purchases_outliers)
将熊猫作为pd导入
将numpy作为np导入
将matplotlib.pyplot作为plt导入
数据={
‘苹果’:[3,2,0,np.nan,2],
“橙子”:[0,7,7,2,7],
‘无花果’:[1,np.nan,10,np.nan,10]
}
采购=pd.DataFrame(数据)
采购=pd.DataFrame(数据,索引=['June','Robert','Lily','David','Bob'])
#计算每行NaN的比例
l=len(采购.列)
m=len(采购)
n_nan=0
W=[0表示范围内的W(m)]
X=[i代表范围(0,m)内的i]
对于范围(0,m)内的i:
n_nan=purchases.iloc[i,:].isna().sum()
打印('row',i,'NaN数',n_NaN,'%NaN',n_NaN*100/l)
W[i]=n_南*100/l
#编写代码,根据缺失数据的数量将数据分成两个子集
#每行中的值。
#使用https://www.shanelynn.ie/using-pandas-dataframe-creating-editing-viewing-data-in-python/
purchases\u normal=purchases.copy()
purchases\u outliers=purchases.copy()
打印(‘购买’)
印刷(采购)
打印('-------------------------')
#
对于范围(0,m-0)内的j:
#打印('row',j',W=',W[j])
如果W[j]>20:
print('在迭代时,j,'将从购买中退出_正常值为W=',W[j],'is>20')
采购正常下降(采购正常指数[j],原地=真)
其他:
print('在迭代时,j,'将从购买中删除\u异常值为W=',W[j],'为<20')
采购异常值。下降(采购异常值。指数[j],原地=真)
打印(‘正常购买’)
打印(正常购买)
打印('----')
打印(‘异常值’)
打印(采购和异常值)
尝试以下循环:

for j in range(0,m-0):
#    print('row ',j,' W = ',W[j])
    if W[j]> 20:
        print('at iteration ',j, ' going to drop from purchases_normal as W= ', W[j],' is > 20')
        purchases_normal = purchases_normal.drop(purchases.index[j])
    else:
        print('at iteration ',j, ' going to drop from purchases_outliers as W= ', W[j],' is < 20')
        purchases_outliers = purchases_outliers.drop(purchases.index[j])
范围(0,m-0)内j的
:
#打印('row',j',W=',W[j])
如果W[j]>20:
print('在迭代时,j,'将从购买中退出_正常值为W=',W[j],'is>20')
采购正常=采购正常下降(采购指数[j])
其他:
print('在迭代时,j,'将从购买中删除\u异常值为W=',W[j],'为<20')
采购\异常值=采购\异常值.drop(采购.指数[j])
尝试以下循环:

for j in range(0,m-0):
#    print('row ',j,' W = ',W[j])
    if W[j]> 20:
        print('at iteration ',j, ' going to drop from purchases_normal as W= ', W[j],' is > 20')
        purchases_normal = purchases_normal.drop(purchases.index[j])
    else:
        print('at iteration ',j, ' going to drop from purchases_outliers as W= ', W[j],' is < 20')
        purchases_outliers = purchases_outliers.drop(purchases.index[j])
范围(0,m-0)内j的
:
#打印('row',j',W=',W[j])
如果W[j]>20:
print('在迭代时,j,'将从购买中退出_正常值为W=',W[j],'is>20')
采购正常=采购正常下降(采购指数[j])
其他:
print('在迭代时,j,'将从购买中删除\u异常值为W=',W[j],'为<20')
采购\异常值=采购\异常值.drop(采购.指数[j])

熊猫是以一种不必为循环使用
的方式构建的。如果您发现自己在使用for循环,则有98%的可能是错误的

如果我了解您的目标:
1.按行查找NaN的编号
2.获取用于逻辑的百分比(X时下降)

#。。。
df['number\u nan']=df.isna().sum(轴=1)
df['pct\u nan']=df['number\u na']/len(df.列)
现在有了这些附加列。你可以过滤

高于20=.2
#dt=缺失值超过20%的行的df
dt=df[df['pct_na']>高于20]

如果我了解您的目标,请告诉我。

熊猫是以一种您不必为循环使用
的方式构建的。如果您发现自己在使用for循环,则有98%的可能是错误的

如果我了解您的目标:
1.按行查找NaN的编号
2.获取用于逻辑的百分比(X时下降)

#。。。
df['number\u nan']=df.isna().sum(轴=1)
df['pct\u nan']=df['number\u na']/len(df.列)
现在有了这些附加列。你可以过滤

高于20=.2
#dt=缺失值超过20%的行的df
dt=df[df['pct_na']>高于20]

如果我了解您的目标,请告诉我。

在您的就地放置中,您正在更改索引,因此,下一次
index[j]
将不是您期望的。在就地放置中,您正在更改索引,因此,下一次
index[j]
将不是您期望的。两种建议的解决方案都很好。非常感谢你。除了我仍在使用for循环之外,我的代码中还有什么问题?两个建议的解决方案都很好。非常感谢你。除了我仍在使用for循环之外,我的代码中还有什么问题?