2016-11-08 96 views
2

我使用read_csv並希望刪除一些具有特定值的行,我可以在單獨的行中做到這一點,但是當我想在同一行中調用它們時,它將返回一個NoneType錯誤。熊貓設置多行數據幀

我的第一個代碼:

census_df = pd.read_csv('census.csv') 
census_df.drop(census_df['SUMLEV'] == 40, inplace=True) 

我想做的事:

census_df = (pd.read_csv('census.csv') 
       .drop(census_df['SUMLEV'] == 40, inplace=True)) 

它返回一個錯誤:

TypeError: 'NoneType' object is not subscriptable

回答

1

我想你需要通過indexboolean indexing下降:

census_df = (pd.read_csv('census.csv').drop(census_df[(census_df['SUMLEV'] == 40)].index)) 

但更好的是使用boolean indexing

census_df = pd.read_csv('census.csv') 
census_df = census_df[census_df['SUMLEV'] != 40] 
+0

是的,我知道布爾方式,我只是想在輸入乾淨代碼的數據框時應用它。 順便說一句,布爾索引比.drop更好嗎? – paulmassimo

+0

我測試它,並與滴更慢2倍。 'c':['SUMLEV':[40,2,3], 'B':[4,5,6], 'C':[7,8,9], 'D' :[1,3,5], 'E':[5,3,6], 'F':[7,4,3]}) print(census_df)'然後'%timeit(census_df [(census_df ['SUMLEV']!= 40)]) 1000循環,最好爲3:每循環388微秒和'%timeit(census_df.drop(census_df [(census_df ['SUMLEV'] == 40)] .index)) 1000循環,最好3:每循環723微秒' – jezrael

+0

非常感謝 – paulmassimo

1

的原因是下降返回None如果是指示在現場執行(按照就地操作員的建議)。移除操作員(這會產生一些內存和處理成本)或者分兩行操作。

+0

刪除就地後,它跑了,但答錯,僅下降了第一行值爲40. – paulmassimo

+0

通常應該工作,我不知道你的代碼有什麼不同,抱歉。我會建議用更多信息打開一個新問題 –

+0

我必須刪除所有具有值的行的索引。謝謝。 – paulmassimo