我有一个DataFrames字典,其中的键指向数据的年份。我想遍历字典并修改DataFrames。我同时修改了列名称和dfs的内容。
for year, df in df_data.items():
cols = df .columns
new_cols = [re.sub(r'\s\d{4}\-\d{2}', '', c) for c in cols]
df.columns = new_cols
for year, df in df_data.items():
df['Date'] = pd.to_datetime(df['Date'], infer_datetime_format=True)
df = df.drop_duplicates(subset='Id', keep='first')
有人可以向我解释这样做的行为吗?特别是,如何将dfs存储在内存中以及为何对列进行重命名而对内容进行修改却不起作用。另外,是否存在通过复制df然后将其替换为dict索引或不断对df_data [year]参考进行更改的最佳方法?
如上面的@ juanpa.arrivillaga所述,drop_duplicates
返回一个数据框,您将其分配给局部变量df
。考虑以下示例:
a = [0, 1]
for b in a:
print(f'b: {b}')
b = 2
print(f'b: {b}')
print(f'a: {a}')
这是输出:
b: 0
b: 2
b: 1
b: 2
a: [0, 1]
您可以看到为本地var b
分配了value 2
,但是a
在循环完成之后该列表未更改。这是因为b
是对列表的引用,而不是列表本身。分配b = 2
导致b
更改为对整数的引用2
,但不会导致引用的列表项b
更改为对整数的引用2
。在第一个循环的开始,引用看起来像这样:
b -> a[0] -> the integer 0
b = 2
在此分配结果:
a[0] -> the integer 0
b -> the integer 2
不是这个:
b -> a[0] -> the integer 2
要循环修改对象,您必须仅使用适当的方法,或者必须直接引用该对象:
for year in df_data.keys():
cols = df[year].columns
new_cols = [re.sub(r'\s\d{4}\-\d{2}', '', c) for c in cols]
df[year].columns = new_cols
for year in df_data.keys():
df[year]['Date'] = pd.to_datetime(df[year]['Date'], infer_datetime_format=True)
df[year] = df[year].drop_duplicates(subset='Id', keep='first')
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句