我一直在寻找这个,但我似乎无法找到它(尽管它必须非常微不足道)。
我遇到的问题是我想检索数据框的第一个和最后一个条目的列值。但如果我这样做:
df.ix[0]['date']
我明白了:
datetime.datetime(2011, 1, 10, 16, 0)
但如果我这样做:
df[-1:]['date']
我明白了:
myIndex
13 2011-12-20 16:00:00
Name: mydate
使用不同的格式。理想情况下,我希望能够访问数据框的最后一个索引的值,但我找不到如何。
我甚至尝试使用索引值创建一个列(IndexCopy)并尝试:
df.ix[df.tail(1)['IndexCopy']]['mydate']
但这也会产生不同的格式(因为df.tail(1)['IndexCopy']不输出一个简单的整数)。
有什么想法吗?
答案 0 :(得分:71)
以前的答案现在被.iloc
取代:
>>> df = pd.DataFrame({"date": range(10, 64, 8)})
>>> df.index += 17
>>> df
date
17 10
18 18
19 26
20 34
21 42
22 50
23 58
>>> df["date"].iloc[0]
10
>>> df["date"].iloc[-1]
58
我能想到的最短路线使用.iget()
:
>>> df = pd.DataFrame({"date": range(10, 64, 8)})
>>> df.index += 17
>>> df
date
17 10
18 18
19 26
20 34
21 42
22 50
23 58
>>> df['date'].iget(0)
10
>>> df['date'].iget(-1)
58
可替换地:
>>> df['date'][df.index[0]]
10
>>> df['date'][df.index[-1]]
58
还有.first_valid_index()
和.last_valid_index()
,但根据您是否要排除NaN
s,它们可能不是您想要的。
请记住,df.ix[0]
不会给你第一个,但会给你一个索引为0.例如,在上面的例子中,df.ix[0]
会产生
>>> df.ix[0]
Traceback (most recent call last):
File "<ipython-input-489-494245247e87>", line 1, in <module>
df.ix[0]
[...]
KeyError: 0
答案 1 :(得分:11)
在Get index of a row of a pandas dataframe as an integer
中结合@ comte的答案和dmdip的答案df.tail(1).index.item()
为您提供索引的值。
请注意,索引不始终定义良好,无论它们是多索引还是单索引。使用索引修改数据帧可能会导致意外行为。我们将有一个带有多索引案例的示例,但注意在单索引案例中也是如此。
说我们有
df = pd.DataFrame({'x':[1,1,3,3], 'y':[3,3,5,5]}, index=[11,11,12,12]).stack()
11 x 1
y 3
x 1
y 3
12 x 3
y 5 # the index is (12, 'y')
x 3
y 5 # the index is also (12, 'y')
df.tail(1).index.item() # gives (12, 'y')
尝试访问索引为df[12, "y"]
的最后一个元素,产生
(12, y) 5
(12, y) 5
dtype: int64
如果您尝试根据索引(12, y)
修改数据框,则将修改两行而不是一行。因此,即使我们学会了访问最后一行索引的值,如果你想根据索引更改最后一行的值可能不是一个好主意,因为可能有很多共享相同的指数。在这种情况下,您应该使用df.iloc[-1]
来访问最后一行。
<强>参考强>
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.item.html
答案 2 :(得分:4)
df.tail(1).index
似乎是最具可读性的
答案 3 :(得分:2)
您想要带双括号的.iloc。
import pandas as pd
df = pd.DataFrame({"date": range(10, 64, 8), "not_date": "fools"})
df.index += 17
df.iloc[[0,-1]][['date']]
您给.iloc一个索引列表-特别是第一个和最后一个[0,-1]。这将返回一个数据框,您可以从中请求“日期”列。 ['date']将为您提供一系列( yuck ),[['date']]将为您提供一个数据框。
答案 4 :(得分:0)
现在可能为时已晚,我使用index
方法检索DataFrame的最后一个索引,然后使用[-1]
获得最后的值:
例如,
df = pd.DataFrame(np.zeros((4, 1)), columns=['A'])
print(f'df:\n{df}\n')
print(f'Index = {df.index}\n')
print(f'Last index = {df.index[-1]}')
输出为
df:
A
0 0.0
1 0.0
2 0.0
3 0.0
Index = RangeIndex(start=0, stop=4, step=1)
Last index = 3
答案 5 :(得分:0)
Pandas支持NumPy语法,该语法允许:
df[len(df) -1:].index[0]
答案 6 :(得分:-1)
打印数据框的索引范围,然后使用方括号和.loc调用最后一个索引:
import pandas as pd
#使用熊猫read_csv读取示例数据集
df = pd.read_csv(
'https://raw.githubusercontent.com/plotly/datasets/master/1962_2006_walmart_store_openings.csv'
)
#使用pandas函数'index'记录数据帧的索引范围
index = df.index
print(index)
>>> RangeIndex(start = 0,stop = 2992,step = 1)
'''传递((stop)-1)的结果,因为数据框中的最后一个索引通常是为数据信息保留的''
df.loc[0, 2991]
>>>(将打印具有第一个和最后一个索引的数据表)
或者对于更简单但不太明确的替代方法,您可以执行以下操作:
df = pd.read_csv(
'https://raw.githubusercontent.com/plotly/datasets/master/1962_2006_walmart_store_openings.csv'
)
df.loc[[0, df.index[-1]]]