如何在熊猫中防止“ [MultiIndex ...]都不在[列]中”?

时间:2020-10-27 13:33:29

标签: python arrays pandas numpy dataframe

在下面的示例代码中,我将NumPy数组添加到Pandas DataFrame。为了避免使用SettingWithCopyWarning,我重新编写了代码,但是现在我得到的是KeyError

“ [MultiIndex([('new',0),\ n('new',1),\ n('new',2)],\ n)]都不在[列]中”

这没错,因为给定列不在中。但是为什么他们需要成为这样?

import numpy as np
import pandas as pd

df_ = pd.DataFrame(range(10), columns=[["old"], [0]])
df = df_[df_.old[0] < 4]

arr = np.random.randn(4, 3)
indices = pd.MultiIndex.from_product([["new"], range(arr.shape[-1])])

# A value is trying to be set on a copy of a slice from a DataFrame.
# Try using .loc[row_indexer,col_indexer] = value instead
# df[indices] = pd.DataFrame(arr, index=df.index)

# OK - I did that! This works after the previous line, but not without it:
df.loc[:, indices] = pd.DataFrame(arr, index=df.index)

1 个答案:

答案 0 :(得分:2)

问题在这里:

df_ = pd.DataFrame(range(10), columns=[["old"], [0]])
df = df_[df_.old[0] < 4]

其中dfdf_的一部分。复制它:

df_ = pd.DataFrame(range(10), columns=[["old"], [0]])
df = df_[df_.old[0] < 4].copy()

更新:根据您的评论

df.loc[:, indices] = pd.DataFrame(arr, index=df.index)

不起作用,因为它们具有不同的列。左侧具有MultiIndex列indices,而右侧具有RangeIndex列0,1,2。如果可以的话,是否应该工作?

df.loc[:, indices] = pd.DataFrame(arr, index=df.index, columns=indices)

df.loc[:, indices] = arr