如何(以及为什么)制作 pandas dataframe 的副本


每次创建 pandas DataFrame 的子集然后修改该子集时,原始 DataFrame 也会被修改。

因此,在子集化时使用.copy()总是一个好主意,这样您对子集所做的更改就不会同时对原始 DataFrame 进行。

以下示例展示了在子集化时如何(以及为什么)制作 pandas DataFrame 的副本。

示例 1:在没有副本的情况下对 DataFrame 进行子集化

假设我们有以下 pandas DataFrame:

 import pandas as pd

#createDataFrame
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 to 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:28 a.m. 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
0X18 5
1 B 22 7
2 C 19 7
3 D 14 9

#view original DataFrame
print (df)

  team points assists
0X18 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:28 a.m. 4

请注意,在子集 DataFrame原始 DataFrame 中,团队列的第一个值都从“A”更改为“X”。

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

示例 2:使用副本对 DataFrame 进行子集化

让我们再次假设我们有以下 pandas DataFrame:

 import pandas as pd

#createDataFrame
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 to 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:28 a.m. 4

让我们再次假设我们创建一个仅包含原始 DataFrame 的前四行的子集,但这次我们使用.copy()来复制原始 DataFrame:

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

现在假设我们更改 DataFrame 子集的 team 列的第一个值:

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

#view subsetted DataFrame
print (df_subset)

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

#view original DataFrame
print (df)

  team points assists
0 to 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:28 a.m. 4

请注意,仅在 DataFrame 子集中,团队列的第一个值从“A”更改为“X”。

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

其他资源

以下教程解释了如何在 pandas 中执行其他常见操作:

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

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注