我在将一系列类似对象分配给 Pandas 数据帧的切片时遇到问题。 也许我没有按照预期的方式使用 Datafarme,所以一些启示将不胜感激。 我已经阅读了以下文章:
pandas: slice a MultiIndex by range of secondary index
Returning a view versus a copy
据我了解,我通过一次 .loc 调用调用切片的方式确实确保我没有得到数据的副本。显然,原始数据帧也被更改,但我得到的不是预期的数据,而是 NaN 值。 请参阅附加的代码片段。
我是否必须针对要更改的每个单个值迭代数据帧的所需部分并使用 .set_value(row_idx,col_idx,val) 方法?
提前致以亲切的问候和感谢
马库斯
In [1]: import pandas as pd
In [2]: mindex = pd.MultiIndex.from_product([['one','two'],['first','second']])
In [3]: dfmi = pd.DataFrame([list('abcd'),list('efgh'),list('ijkl'),list('mnop')],
...: index = mindex, columns=(['X','Y','Z','Q']))
In [4]: print(dfmi)
X Y Z Q
one first a b c d
second e f g h
two first i j k l
second m n o p
In [5]: dfmi.loc[('two',slice('first','second')),'X']
Out[5]:
two first i
second m
Name: X, dtype: object
In [6]: substitute = pd.Series(data=["ab","cd"], index= mindex.levels[1])
...: print(substitute)
first ab
second cd
dtype: object
In [7]: dfmi.loc[('two',slice('first','second')),'X'] = substitute
In [8]: print(dfmi)
X Y Z Q
one first a b c d
second e f g h
two first NaN j k l
second NaN n o p
最佳答案
发生的事情是 substitute
有一个索引,它确定值的位置,并且 dfmi.loc[('two',slice('first','second') ),'X']
也指定了这样的位置。
在分配期间,pandas 尝试对齐两个索引,并且由于它们不匹配(如果 substitute
也是多索引,则它们会匹配),因此对齐的结果都是 NA,这得到插入。
解决方案可能是删除 substitute
的索引,因为您想要插入值的位置已在 loc
中指定:
dfmi.loc[('two',slice('first','second')),'X'] = substitute.values
或者更简单,直接插入值:
dfmi.loc[('two',slice('first','second')),'X'] = ["ab","cd"]
关于pandas:按二级索引范围将值分配给多索引切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39508306/