如何以及为什么复制Pandas的数据框架?

288 阅读3分钟

每当你创建一个pandas DataFrame的子集,然后修改该子集,原始DataFrame也会被修改。

出于这个原因,在创建子集时使用.copy()总是一个好主意,这样你对子集的任何修改都不会被修改到原始DataFrame上。

下面的例子展示了在子集时如何(以及为什么)对pandas DataFrame进行复制。

例子1:在不复制的情况下对DataFrame进行子集处理

假设我们有下面这个pandas DataFrame。

import pandas as pd

#create DataFrame
df = pd.DataFrame({'team': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
                   'points': [18, 22, 19, 14, 14, 11, 20, 28],
                   'assists': [5, 7, 7, 9, 12, 9, 9, 4]})

#view DataFrame
print(df)

  team  points  assists
0    A      18        5
1    B      22        7
2    C      19        7
3    D      14        9
4    E      14       12
5    F      11        9
6    G      20        9
7    H      28        4

现在假设我们创建一个子集,它只包含原始DataFrame的前四行。

#define subsetted DataFrame
df_subset = df[0:4]

#view subsetted DataFrame
print(df_subset)

  team  points  assists  rebounds
0    A      18        5        11
1    B      22        7         8
2    C      19        7        10
3    D      14        9         6

如果我们修改子集中的一个值,原始DataFrame中的值也会被修改。

#change first value in team column
df_subset.team[0] = 'X'

#view subsetted DataFrame
print(df_subset)

  team  points  assists
0    X      18        5
1    B      22        7
2    C      19        7
3    D      14        9

#view original DataFrame
print(df)

  team  points  assists
0    X      18        5
1    B      22        7
2    C      19        7
3    D      14        9
4    E      14       12
5    F      11        9
6    G      20        9
7    H      28        4

注意,在子集数据框架原始数据框架中,团队列的第一个值已经从'A'改为'X'。

这是因为我们没有复制原始DataFrame。

例2:通过复制对数据框架进行子集处理

再一次假设我们有如下的pandas DataFrame。

import pandas as pd

#create DataFrame
df = pd.DataFrame({'team': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
                   'points': [18, 22, 19, 14, 14, 11, 20, 28],
                   'assists': [5, 7, 7, 9, 12, 9, 9, 4]})

#view DataFrame
print(df)

  team  points  assists
0    A      18        5
1    B      22        7
2    C      19        7
3    D      14        9
4    E      14       12
5    F      11        9
6    G      20        9
7    H      28        4

再一次假设我们创建了一个子集,只包含原始DataFrame的前四行,但是这次我们使用了**.copy()**来制作原始DataFrame的副本。

#define subsetted DataFrame
df_subset = df[0:4].copy()

现在假设我们改变了子集DataFrame中团队列的第一个值。

#change first value in team column
df_subset.team[0] = 'X'

#view subsetted DataFrame
print(df_subset)

  team  points  assists
0    X      18        5
1    B      22        7
2    C      19        7
3    D      14        9

#view original DataFrame
print(df)

  team  points  assists
0    A      18        5
1    B      22        7
2    C      19        7
3    D      14        9
4    E      14       12
5    F      11        9
6    G      20        9
7    H      28        4

注意,只有在子集的DataFrame中,团队列的第一个值从'A'改为'X'。

原始DataFrame保持不变,因为我们在创建子集时使用了.copy()来制作它的副本。

其他资源

下面的教程解释了如何在pandas中执行其他常见操作。

如何根据条件在Pandas DataFrame中删除行
如何根据多个条件过滤Pandas DataFrame
如何在Pandas DataFrame中使用 "NOT IN "过滤器