修改列表中的dataFrames无效

met*_*eto 4 python iteration list pandas

我有两个DataFrames,我想执行相同的清洁操作列表.我意识到我可以合并为一个,并且可以合并到一个通道中,但我仍然很好奇为什么这个方法不起作用

test_1 = pd.DataFrame({
    "A": [1, 8, 5, 6, 0],
    "B": [15, 49, 34, 44, 63]
})
test_2 = pd.DataFrame({
    "A": [np.nan, 3, 6, 4, 9, 0],
    "B": [-100, 100, 200, 300, 400, 500]
})
Run Code Online (Sandbox Code Playgroud)

让我们假设我只想在没有NaNs的情况下使用原始数据:我试过了

for df in [test_1, test_2]:
    df = df[pd.notnull(df["A"])]
Run Code Online (Sandbox Code Playgroud)

test_2没有动过.另一方面,如果我这样做:

test_2 = test_2[pd.notnull(test_2["A"])]
Run Code Online (Sandbox Code Playgroud)

现在我第一个原始消失了.

cs9*_*s95 6

所有这些切片/索引操作都会创建原始数据帧的视图/副本,然后重新分配 df给这些视图/副本,这意味着根本不会触及原始数据.

选项1
dropna(...inplace=True)
尝试就地dropna呼叫,这应该就地修改原始对象

df_list = [test_1, test_2]
for df in df_list:
    df.dropna(subset=['A'], inplace=True)  
Run Code Online (Sandbox Code Playgroud)

请注意,这是我推荐就地修改的少数几次之一,特别是因为这个用例.


选项2
enumerate与重新分配
或者,您可以重新分配到列表 -

for i, df in enumerate(df_list):
    df_list[i] = df.dropna(subset=['A'])  # df_list[i] = df[df.A.notnull()]
Run Code Online (Sandbox Code Playgroud)