She*_*don 26 python indexing pandas
让我们考虑以下数据框:
import pandas as pd
d = {'col1': [1, 2, 3], 'col2': [3, 4, 5]}
df=pd.DataFrame(data=d)
Run Code Online (Sandbox Code Playgroud)
如果我想访问 pandas 系列中的第一个元素df['col1'],我可以简单地去df['col1'][0]。
但是我怎样才能访问这个系列的最后一个元素呢?我试过df['col1'][-1]它返回以下错误:
密钥错误:-1L
我知道我可以做类似的事情,df['col1'][len(df)-1]但为什么反向索引在这里是不可能的?
jez*_*ael 50
对于选择最后一个值需要Series.iloc或Series.iat,因为df['col1']返回Series:
print (df['col1'].iloc[-1])
3
print (df['col1'].iat[-1])
3
Run Code Online (Sandbox Code Playgroud)
或将系列转换为 numpy 数组并选择最后一个:
print (df['col1'].values[-1])
3
Run Code Online (Sandbox Code Playgroud)
或使用DataFrame.ilocor DataFrame.iat- 但列的必要位置为Index.get_loc:
print (df.iloc[-1, df.columns.get_loc('col1')])
3
print (df.iat[-1, df.columns.get_loc('col1')])
3
Run Code Online (Sandbox Code Playgroud)
或者可以使用索引的最后一个值(必须不重复)并选择DataFrame.loc:
print (df.loc[df.index[-1], 'col1'])
3
Run Code Online (Sandbox Code Playgroud)
小智 16
最后获取值是最快的方法:
\n%timeit df['code'].values[-1]. )\nRun Code Online (Sandbox Code Playgroud)\n\n\n5.58 \xc2\xb5s \xc2\xb1 每个循环 985 ns(意味着 \xc2\xb1 标准偏差 7 次运行,每次 100000 次循环)
\n
%timeit df.loc[df.index[-1], 'code']\nRun Code Online (Sandbox Code Playgroud)\n\n\n12 \xc2\xb5s \xc2\xb1 2.71 \xc2\xb5s 每个循环(平均 \xc2\xb1 标准偏差 7 次运行,每次 100000 次循环)
\n
%timeit df['code'].iat[-1]\n\nRun Code Online (Sandbox Code Playgroud)\n\n\n5.71 \xc2\xb5s \xc2\xb1 每个循环 896 ns(意味着 \xc2\xb1 标准偏差 7 次运行,每次 100000 次循环)
\n
%timeit df['code'].tail(1).item()\nRun Code Online (Sandbox Code Playgroud)\n\n\n36 \xc2\xb5s \xc2\xb1 3.23 \xc2\xb5s 每个循环(平均 \xc2\xb1 标准偏差 7 次运行,每次 10000 次循环)
\n
%timeit df.iloc[-1, df.columns.get_loc('code')]\nRun Code Online (Sandbox Code Playgroud)\n\n\n33.7 \xc2\xb5s \xc2\xb1 5.23 \xc2\xb5s 每个循环(平均 \xc2\xb1 标准偏差 7 次运行,每次 10000 次循环)
\n
%timeit df['code'].iloc[-1]\nRun Code Online (Sandbox Code Playgroud)\n\n\n8.08 \xc2\xb5s \xc2\xb1 每个循环 496 ns(平均 \xc2\xb1 标准偏差 7 次运行,每次 100000 次循环)
\n
您还可以使用tail:
print(df['col1'].tail(1).item())
Run Code Online (Sandbox Code Playgroud)
输出:
3
Run Code Online (Sandbox Code Playgroud)