在下面的示例代码中,我将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)
答案 0 :(得分:2)
问题在这里:
df_ = pd.DataFrame(range(10), columns=[["old"], [0]])
df = df_[df_.old[0] < 4]
其中df
是df_
的一部分。复制它:
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