繁体   English   中英

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。 我已经尝试做很多事情来解决这个问题,但似乎没有任何效果。 我不认为这是因为“不到 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM