每当你创建一个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 "过滤器