这是因为每次执行这样的子集时,
df[<whatever>]您都将返回一个新的数据帧,并将其分配给
df循环变量,该变量在您每次进行下一次迭代时都会消失(尽管您保留了最后一个)。这类似于切片列表:
>>> list1 = [1,2,3,4]>>> list2 = [11,12,13,14]>>> for lyst in list1,list2:... lyst = lyst[1:-1]... >>> list1, list2([1, 2, 3, 4], [11, 12, 13, 14])>>> lyst[12, 13]
通常,如果要实际就地修改列表,则需要使用mutator方法。等效地,对于数据框,您可以在索引器上使用赋值,例如将
.loc/.ix/.iloc/etc与该
.dropna方法结合使用,请小心传递
inplace=True参数。假设我有三个数据框,而我只想保留第二列为正的行:
警告:这种方式并不理想,请查看编辑以获得更好的方式
In [11]: df1Out[11]:0 1 2 30 0.957288 -0.170286 0.406841 -3.0584431 1.762343 -1.837631 -0.867520 1.6661932 0.618665 0.660312 -1.319740 -0.0248543 -2.008017 -0.445997 -0.028739 -0.2276654 0.638419 -0.271300 -0.918894 1.5240095 0.957006 1.181246 0.513298 0.3701746 0.613378 -0.852546 -1.778761 -1.3868487 -1.891993 -0.304533 -1.427700 0.099904In [12]: df2Out[12]:0 1 2 30 -0.521018 0.407258 -1.167445 -0.3635031 -0.879489 0.008560 0.224466 -0.1658632 0.550845 -0.102224 -0.575909 -0.4047703 -1.171828 -0.912451 -1.197273 0.7194894 -0.887862 1.073306 0.351835 0.3139535 -0.517824 -0.096929 -0.300282 0.7160206 -1.121527 0.183219 0.938509 0.8428827 0.003498 -2.241854 -1.146984 -0.751192In [13]: df3Out[13]:0 1 2 30 0.240411 0.795132 -0.305770 -0.3322531 -1.162097 0.055346 0.094363 -1.2548592 -0.493466 -0.717872 1.090417 -0.5918723 1.021246 -0.060453 -0.013952 0.3049334 -0.859882 -0.947950 0.562609 1.3136325 0.917199 1.186865 0.354839 -1.7717876 -0.694799 -0.695505 -1.077890 -0.8805637 1.088068 -0.893466 -0.188419 -0.451623In [14]: for df in df1, df2, df3: ....: df.loc[:,:] = df.loc[df[1] > 0,:] ....: df.dropna(inplace = True,axis =0) ....:In [15]: df1dfOut[15]:0 1 2 32 0.618665 0.660312 -1.319740 -0.0248545 0.957006 1.181246 0.513298 0.370174In [16]: df2Out[16]:0 1 2 30 -0.521018 0.407258 -1.167445 -0.3635031 -0.879489 0.008560 0.224466 -0.1658634 -0.887862 1.073306 0.351835 0.3139536 -1.121527 0.183219 0.938509 0.842882In [17]: df3Out[17]:0 1 2 30 0.240411 0.795132 -0.305770 -0.3322531 -1.162097 0.055346 0.094363 -1.2548595 0.917199 1.186865 0.354839 -1.771787
编辑添加:
我想我找到了一种更好的方法,只是使用该
.drop方法。
In [21]: df1Out[21]:0 1 2 30 -0.804913 -0.481498 0.076843 1.1365671 -0.457197 -0.903681 -0.474828 1.2894432 -0.820710 1.610072 0.175455 0.7120523 0.715610 -0.178728 -0.664992 1.2614654 -0.297114 -0.591935 0.487698 0.7604505 1.035231 -0.108825 -1.058996 0.0563206 1.579931 0.958331 -0.653261 -0.1712457 0.685427 1.447411 0.001002 0.241999In [22]: df2Out[22]:0 1 2 30 1.660864 0.110002 0.366881 1.7655411 -0.627716 1.341457 -0.552313 0.5788542 0.277738 0.128419 -0.279720 -1.1974833 -1.294724 1.396698 0.108767 1.3534544 -0.379995 0.215192 1.446584 0.5300205 0.557042 0.339192 -0.105808 -0.6932676 1.293941 0.203973 -3.051011 1.6381437 -0.909982 1.998656 -0.057350 2.279443In [23]: df3Out[23]:0 1 2 30 -0.002327 -2.054557 -1.752107 -0.9111781 -0.998328 -1.119856 1.468124 -0.9611312 -0.048568 0.373192 -0.666330 0.8677193 0.533597 -1.222963 0.119789 -0.0379494 1.203075 -0.773511 0.475809 1.3529435 -0.984069 -0.352267 -0.313516 0.1382596 0.114596 0.354404 2.119963 -0.4524627 -1.033029 -0.787237 0.479321 -0.818260In [25]: for df in df1,df2,df3: ....: df.drop(df.index[df[1] < 0],axis=0,inplace=True) ....:In [26]: df1Out[26]:0 1 2 32 -0.820710 1.610072 0.175455 0.7120526 1.579931 0.958331 -0.653261 -0.1712457 0.685427 1.447411 0.001002 0.241999In [27]: df2Out[27]:0 1 2 30 1.660864 0.110002 0.366881 1.7655411 -0.627716 1.341457 -0.552313 0.5788542 0.277738 0.128419 -0.279720 -1.1974833 -1.294724 1.396698 0.108767 1.3534544 -0.379995 0.215192 1.446584 0.5300205 0.557042 0.339192 -0.105808 -0.6932676 1.293941 0.203973 -3.051011 1.6381437 -0.909982 1.998656 -0.057350 2.279443In [28]: df3Out[28]:0 1 2 32 -0.048568 0.373192 -0.666330 0.8677196 0.114596 0.354404 2.119963 -0.452462
当然更快:
In [8]: timeit.Timer(stmt="df.loc[:,:] = df.loc[df[1] > 0, :];df.dropna(inplace = True,axis =0)", setup="import pandas as pd,numpy as np; df = pd.Dataframe(np.random.random((8,4)))").timeit(10000)Out[8]: 23.69621358400036In [9]: timeit.Timer(stmt="df.drop(df.index[df[1] < 0],axis=0,inplace=True)", setup="import pandas as pd,numpy as np; df = pd.Dataframe(np.random.random((8,4)))").timeit(10000)Out[9]: 11.476448250003159



