[英]Dropping column in dataframe with assignment not workng in a loop
我有两个数据框(df_train 和 df_test),其中包含我要删除的列(“日期”)。
据我了解,我可以通过两种方式做到这一点,即使用就地或将 dataframe 分配给自身,例如:
if 'Date' in df_train.columns:
df_train.drop(['Date'], axis=1, inplace=True)
或者
if 'Date' in df_train.columns:
df_train = df_train.drop(['Date'], axis=1)
这两种方法都适用于单个 dataframe ,但前一种方法应该对 memory 更友好,因为与分配者一起创建了 dataframe 的副本。
奇怪的是,我必须对两个数据框都这样做,所以我尝试在一个循环中做同样的事情:
for data in [df_train, df_test]:
if 'Date' in data.columns:
data.drop(['Date'], axis=1, inplace=True)
和
for data in [df_train, df_test]:
if 'Date' in data.columns:
data = data.drop(['Date'], axis=1)
奇怪的是,在这种情况下,只有第一种方法(使用就地)有效。 如果我使用第二种方式,则不会删除“日期”列。 这是为什么?
它不起作用,因为遍历列表并更改列表中的内容实际上并不会更改数据帧的实际列表,因为它只会更改迭代器,因此您应该尝试:
lst = []
for data in [df_train, df_test]:
if 'Date' in data.columns:
lst.append(data.drop(['Date'], axis=1))
print(lst)
现在lst
包含所有数据帧。
最好使用list comprehension
:
res = [data.drop(['Date'], axis=1) for data in [df_train, df_test] if 'Date' in data.columns]
在这里,您将在删除列后获得两个数据框的副本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.