【发布时间】:2017-05-10 19:27:15
【问题描述】:
我想选择并更改数据框单元格的值。该数据框使用了 2 个索引:“datetime”和“idx”。两者都包含唯一且连续的标签。 'datetime' 索引具有 datetime 类型的日期时间标签,而 'idx' 具有整数值标签。
import numpy as np
import pandas as pd
dt = pd.date_range("2010-10-01 00:00:00", periods=5, freq='H')
d = {'datetime': dt, 'a': np.arange(len(dt))-1,'b':np.arange(len(dt))+1}
df = pd.DataFrame(data=d)
df.set_index(keys='datetime',inplace=True,drop=True)
df.sort_index(axis=0,level='datetime',ascending=False,inplace=True)
df.loc[:,'idx'] = np.arange(0, len(df),1)+5
df.set_index('idx',drop=True,inplace=True,append=True)
print(df)
'这是数据框:
a b
datetime idx
2010-10-01 04:00:00 5 3 5
2010-10-01 03:00:00 6 2 4
2010-10-01 02:00:00 7 1 3
2010-10-01 01:00:00 8 0 2
2010-10-01 00:00:00 9 -1 1
'假设我想获取 idx=5 的行。我怎么做?我可以用这个:
print(df.iloc[0])
然后我会得到下面的结果:
a 3
b 5
Name: (2010-10-01 04:00:00, 5), dtype: int32
但我想访问并设置该单元格中的值,其中 idx=5,column='a',通过指定 idx 值和列名 'a'。我该怎么做?
请指教。
【问题讨论】:
-
如果您的问题得到解决,请考虑接受 MaxU 的回答。它更详细。
-
好的,我接受了 MaxU 的回答。但是,我认为我会采用您的解决方案,因为我测试它更快(1.28 毫秒对 2.77 毫秒),并且更短,无需将整数转换为字符串,然后与 'idx' 字符串连接以输入到 eval 函数中。 ..另外,因为我将在 for 循环中使用它。
-
是的。因为 xs 不会遍历整个列来搜索 idx 值。它将计算 5 的哈希值并在 1 go 中获取它。另一个索引,即日期时间索引太长,无法在切片中写入:|
-
@ConanG,你为什么要在 for 循环中使用它?您确定不能使用矢量化方法吗?
-
@ConanG 在我的回答下方阅读 piRSquared 的评论。如果
idx不是唯一的,则不能使用set_value。
标签: python pandas slice multi-index setvalue