Python:如何修复 Python 中的 AttributeError?

Python: How can I fix an AttributeError in Python?

我有代码:

df_mean_woman = df_mean_woman.rename(index = {"Less than 1 year":0}, inplace = True)
df_mean_woman

当我 运行 它时,我得到了错误

AttributeError                            Traceback (most recent call last)
<ipython-input-136-94a5cc6acf63> in <module>
----> 1 df_woman = df_woman.rename(index = {"Less than 1 year":0},
      2                                   #"More than 50 years":int(51)},
      3                                   inplace = True)
      4 df_woman

AttributeError: 'NoneType' object has no attribute 'rename'

尽管当我简单地输入 df_mean_woman.rename(index = {"Less than 1 year":0}, inplace = True) 时错误消失了 但我不能简单地这样做,因为我需要稍后再次调用 df 。我已经尝试做很多事情来解决这个问题,但似乎没有任何效果。我不认为这是因为“Less than 1 year”拼写不正确。我的主要问题似乎是,当我打印出 df_mean_woman(重命名之前)时,据说 df 不存在。 当我重新 运行 Juptyr 时,我能够打印出 df 但所有打印出来的都是 'None'.

我的完整代码是

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
df = pd.read_csv('data.csv') 
%matplotlib inline
df_new = df.copy()
df_new = df_new.drop(['Age1stCode','CompTotal','Respondent', 'MainBranch', 'Hobbyist', 'Age', 'CompFreq', 'Country', 'CurrencyDesc', 'CurrencySymbol', 'DatabaseDesireNextYear', 'DatabaseWorkedWith', 'DevType', 'EdLevel', 'Employment', 'Ethnicity', 'JobFactors', 'JobSat', 'JobSeek', 'LanguageDesireNextYear', 'LanguageWorkedWith', 'MiscTechDesireNextYear', 'MiscTechWorkedWith', 'NEWCollabToolsDesireNextYear', 'NEWCollabToolsWorkedWith', 'NEWDevOps', 'NEWDevOpsImpt', 'NEWEdImpt', 'NEWJobHunt', 'NEWJobHuntResearch', 'NEWLearn', 'NEWOffTopic', 'NEWOnboardGood', 'NEWOtherComms', 'NEWOvertime', 'NEWPurchaseResearch', 'NEWPurpleLink', 'NEWSOSites', 'NEWStuck', 'OpSys', 'OrgSize', 'PlatformDesireNextYear', 'PlatformWorkedWith', 'PurchaseWhat', 'Sexuality', 'SOAccount', 'SOComm', 'SOPartFreq', 'SOVisitFreq', 'SurveyEase', 'SurveyLength', 'Trans', 'UndergradMajor', 'WebframeDesireNextYear', 'WebframeWorkedWith', 'WelcomeChange', 'WorkWeekHrs', 'YearsCodePro'], axis = 'columns')
df_new = df_new.dropna()
df_new    
df_woman = df_new.drop(index=df_new[df_new['Gender'] != 'Woman'].index, inplace=True)
df_woman = df_new
df_woman = df_woman.drop(['Gender'], axis ='columns')
df_news = df_new.copy()

df_woman = df_woman.rename(index = {"Less than 1 year":int(0)},
                                  #"More than 50 years":int(51)},
                                  inplace = True)
df_woman['YearsCode'] = df_woman['YearsCode'].apply(lambda x: '{0:0>2}'.format(x))
df_mean_woman = df_woman.groupby('YearsCode')['ConvertedComp'].mean().sort_index()

df_mean_woman
df_woman = df_new.drop(index=df_new[df_new['Gender'] != 'Woman'].index, inplace=True)

.drop() returns Noneinplace=True.

看这里https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html

看起来您排除的列比包含的列多,因此列出您想要的列比列出更长的要删除的列更容易。

总的来说,我不会使用 drop,而是会使用 loc 来进行大部分操作。还不清楚您为什么要尝试操纵索引而不是列值。

# looks like Whosebug survey data
df = pd.read_csv('survey_results_public.csv')

unwanted = {'Age1stCode','CompTotal','Respondent', 'MainBranch', 'Hobbyist', 'Age', 'CompFreq', 'Country', 
            'CurrencyDesc', 'CurrencySymbol', 'DatabaseDesireNextYear', 'DatabaseWorkedWith', 'DevType', 
            'EdLevel', 'Employment', 'Ethnicity', 'JobFactors', 'JobSat', 'JobSeek', 'LanguageDesireNextYear', 
            'LanguageWorkedWith', 'MiscTechDesireNextYear', 'MiscTechWorkedWith', 'NEWCollabToolsDesireNextYear', 
            'NEWCollabToolsWorkedWith', 'NEWDevOps', 'NEWDevOpsImpt', 'NEWEdImpt', 'NEWJobHunt', 'NEWJobHuntResearch', 
            'NEWLearn', 'NEWOffTopic', 'NEWOnboardGood', 'NEWOtherComms', 'NEWOvertime', 'NEWPurchaseResearch', 
            'NEWPurpleLink', 'NEWSOSites', 'NEWStuck', 'OpSys', 'OrgSize', 'PlatformDesireNextYear', 
            'PlatformWorkedWith', 'PurchaseWhat', 'Sexuality', 'SOAccount', 'SOComm', 'SOPartFreq', 'SOVisitFreq', 
            'SurveyEase', 'SurveyLength', 'Trans', 'UndergradMajor', 'WebframeDesireNextYear', 'WebframeWorkedWith', 
            'WelcomeChange', 'WorkWeekHrs', 'YearsCodePro'}

# no need to copy dataframe before selecting columns
df_new = df.loc[:, list(set(df.columns) - unwanted)]

# use .loc to make df_woman
df_woman = df_new.loc[df_new['Gender'] != 'Woman', df_new.columns.drop('Gender')]

# convert strings to numeric values
df_woman['YearsCode'] = df_woman['YearsCode'].str.replace('Less than 1 year', '0')
df_woman['YearsCode'] = df_woman['YearsCode'].str.replace('More than 50 years', '51')
df_woman['YearsCode'] = pd.to_numeric(df_woman['YearsCode'], errors='coerce').fillna(0).astype(int)

# now groupby and analyze
df_woman.groupby('YearsCode')['ConvertedComp'].mean()