我正在解决一个问题,即我试图逐片构建一个多阵列,但是结果一直是NaN。这是一个最小的工作示例:
midx = pd.MultiIndex(levels=[['zero', 'one'], ['x', 'y']], codes=[[1, 1, 0, 0], [1, 0, 1, 0]])
df = pd.DataFrame(0, index=midx, columns=['A','B']) #empty array
df1 = pd.DataFrame(np.random.randn(2, 2)) #the array I want my slice to equal
df.loc['one'] # good so far
df.loc['one']=df1 # ok .....
df.loc['one'] # all NaNs
####### Output ########
>>> df
A B
one y 0 0
x 0 0
zero y 0 0
x 0 0
>>> df.loc['one']
A B
y 0 0
x 0 0
>>> df.loc['one']=df1
>>> df.loc['one']
A B
y NaN NaN
x NaN NaN
这是为什么,如何解决?
答案 0 :(得分:2)
将df1
分配给df.loc['one']
时,Pandas尝试对齐索引值...但没有对齐。请改用values
的{{1}}属性
df1
嗯...即使他们排队了,也似乎没用。我的建议确实适用于您的示例,但是仍然存在。
假设df.loc['one'] = df1.values
被定义为:
df1
这将提供更多确保值正确排列的保证,但有点让我失望...
df1 = pd.DataFrame(np.random.randn(2, 2), index=['x', 'y'], columns=['A', 'B'])
另一种将必要级别添加到df.loc['one'] = df1.reindex_like(df.loc['one']).values
df1