[英]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。 我已经尝试做很多事情来解决这个问题,但似乎没有任何效果。 我不认为这是因为“不到 1 年”拼写不正确。 我的主要问题似乎是当我打印出 df_mean_woman (重命名之前)时,据说 df 不存在。 当我重新运行 Juptyr 时,我可以打印出 df,但打印出来的都是“无”。
我的完整代码是
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()
在 inplace inplace=True
时返回None
。
见这里https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html
看起来您排除的列比包含的列更多,因此制作所需列的列表而不是要删除的列的更长列表会更容易。
总的来说,我不会使用drop
而是将loc
用于大多数这些操作。 还不清楚您为什么要尝试操作索引而不是列值。
# looks like stackoverflow 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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.