gpt4 book ai didi

python - 循环遍历 Pandas 数据框字典并进行修改的最佳实践是什么?

转载 作者:行者123 更新时间:2023-12-03 17:11:53 26 4
gpt4 key购买 nike

我有一个 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 returns a dataframe ,您将其分配给局部变量 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]

您可以看到本地变量 b正在分配值 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')

关于python - 循环遍历 Pandas 数据框字典并进行修改的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62138620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com