pandas 我无法在 Dataframe 中循环

t98cgbkg  于 2023-06-04  发布在  其他
关注(0)|答案(3)|浏览(147)

因此,我试图循环通过dataframe并根据条件删除列,但我得到了以下错误:Keyerror:1当我使用df_X.loc[:,1]时,即使有一个名为1的列
如果我尝试使用df_X.iloc[:,i],因为所有列都以数字命名,我会得到错误Too many indexers
我很清楚这些列的名称从0到590,所以它们是数字而不是字母数字
使用loc时的代码

cols = df_X.columns
for i in range(len(cols)):
  if (df_X.loc[:,i].isnull().sum())/len(df_X) > .20:
     df_X.drop(i,axis=1,inplace=True)
  else: df_X= df_X.loc[:,i].replace(np.nan,np.mean(df_X.loc[:,i]))

使用iloc时的代码

cols = df_X.columns
for i in range(len(cols)):
  if (df_X.iloc[:,i].isnull().sum())/len(df_X) > .20:
     df_X.drop(i,axis=1,inplace=True)
  else: df_X= df_X.iloc[:,i].replace(np.nan,np.mean(df_X.iloc[:,i]))
lfapxunr

lfapxunr1#

我相信你遇到的问题是在df_X.loc[:,1]中使用整数而不是字符串(df_X.loc[:,'1 ']是正确的),正如巴勃罗所提到的。下面是一个例子:

# Calculate the percentage of null values in each column
null_percentages = df.isnull().mean() * 100

# Create a list of column names that have null percentages greater than 20%
columns_to_drop = null_percentages[null_percentages > 20].index

# Drop the columns from your DataFrame
df_dropped = df.drop(columns=columns_to_drop)
uxh89sit

uxh89sit2#

IIUC,您希望删除nan数大于20%的列,并将其他nan值替换为该列的平均值:

m = df_X.isna().mean().le(0.2)
df_X = df_X.loc[:, m].fillna(df_X.mean())

可重复的示例:

rng = np.random.default_rng(seed=42)
df_X = pd.DataFrame(rng.uniform(0, 1, (10, 590)))
df_X = df_X * np.random.choice([1, np.nan], (10, 590), p=(0.7, 0.3))

您的代码已修复:

for i in df_X.columns:
    if (df_X[i].isnull().sum() / len(df_X)) > .20:
        df_X.drop(i, axis=1, inplace=True)
    else:
        df_X[i] = df_X[i].replace(np.nan, np.mean(df_X[i]))
eblbsuwk

eblbsuwk3#

代码的最后一行有问题
df_X[i] = df_X[i].replace(np.nan,np.mean(df_X[i]))
这改变了整个dataframe到一个列,这就是为什么我得到了太多的索引器作为一个错误。谢谢大家的帮助,我很感激。@Corralien @Eriks Markevis

相关问题