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 None
当 inplace=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()
我有代码:
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 None
当 inplace=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()