【问题标题】:Why does my original dataframe change as well?为什么我的原始数据框也发生了变化?
【发布时间】:2021-05-16 19:33:03
【问题描述】:

对于我正在使用的数据集,它可以在 Kaggle 上的 link 上找到

我正在这样做:

import pandas as pd

df = pd.read_csv('./survey_results_public.csv')

df = df.dropna(subset=['Salary'], axis = 0).drop(['Respondent','ExpectedSalary','Salary'], axis = 1)

print(df['HoursPerWeek'].mean())
print(sum(df['HoursPerWeek'].isnull()))

# Method 1
df1 = df
df1 = df1.select_dtypes(include=['float']).fillna(df1.mean())

print(df['HoursPerWeek'].mean())
print(sum(df['HoursPerWeek'].isnull()))
print(df1['HoursPerWeek'].mean())
print(sum(df1['HoursPerWeek'].isnull()))


# Method 2
df2 = df
num_vars = df2.select_dtypes(include = ['float']).columns
for col in num_vars:
    df2[col].fillna(df2[col].mean(),inplace = True)

print(df['HoursPerWeek'].mean())
print(sum(df['HoursPerWeek'].isnull()))
print(df2['HoursPerWeek'].mean())
print(sum(df2['HoursPerWeek'].isnull()))

我的问题是:为什么“方法 2”也会改变 df,正如在最后 4 个打印语句中观察到的那样,其中空值的平均值和数量是 df 和 df2 之间的值?

当我在 python 中对普通变量做类似的事情时,这不会发生

a=2
b=a
c=a

print(a,b,c)

b += 2

print(a,b,c)

c += 3

print(a,b,c)

在这个例子中,a 没有改变。

【问题讨论】:

标签: python python-3.x pandas dataframe


【解决方案1】:

您要做的是复制数据框:

...
# Method 1
df1 = df.copy()
df1 = df1.select_dtypes(include=['float']).fillna(df1.mean())
....
# Method 2
df2 = df.copy()
num_vars = df2.select_dtypes(include = ['float']).columns
...

希望这会有所帮助:D

一个很好的例子是列表:

a = [1,2,3]
b = a
a.append(4)
print("b is",b)
# output is 'b is [1,2,3,4]

【讨论】:

  • 感谢您提供的信息。有道理,我会查看博客文章。你知道为什么“方法一”没有改变原来的DataFrame吗?
  • 是的,df1.select_dtypes(include=['float']).fillna(df1.mean()) 函数已经返回了数据帧的副本。因此不改变原来的(至尊链接到df)。与此相反,第二种方法df2[col].fillna(df2[col].mean(),inplace = True) 包括inplace=True 论证,该论证指出不创建副本而是替换数据帧的实际条目,即原始df 数据帧的条目
  • no python 没有“原始”和“非原始”类型的概念
  • 是的,python没有primitves和non-primitives的概念。但是,我认为这个概念有助于理解挑战中提出的问题。我将编辑答案。
  • 感谢两位的贡献。你帮助我加深了理解。
猜你喜欢
  • 2013-05-13
  • 2016-01-27
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2016-06-24
  • 2019-05-09
  • 1970-01-01
  • 2016-10-18
相关资源
最近更新 更多