我有以下資料框:
import pandas as pd
d = {'col1': [1, 2], 'col2': [{"a": 5}, {"a": 8}]}
df = pd.DataFrame(data=d)
df
輸出:
col1 col2
0 1 {'a': 5}
1 2 {'a': 8}
我有以下代碼片段(來自一個更大的程式):
for i, r in df.iterrows():
n_df = (r.to_frame().T).copy()
n_df['col2'][i]["a"] = n_df['col2'][i]["a"] - 1
print(n_df)
df
輸出:
col1 col2
0 1 {'a': 4}
col1 col2
1 2 {'a': 7}
col1 col2
0 1 {'a': 4}
1 2 {'a': 7}
最后,我實際上希望df保持不變,因為我在創建n_df時確實使用了.copy()函式。
我在哪里犯錯了?上面的代碼應該如何操作n_df不會改變df?
uj5u.com熱心網友回復:
你不能簡單地DataFrame.copy在這里使用。請參閱頁面底部的注釋:
請注意,當復制包含 Python 物件的物件時,深復制將復制資料,但不會遞回地這樣做。更新嵌套資料物件將反映在深層副本中。
一個可能的(丑陋的?)解決方案:
import pandas as pd
import copy
d = {'col1': [1, 2], 'col2': [{"a": 5}, {"a": 8}]}
df = pd.DataFrame(data=d)
for i, r in df.iterrows():
n_df = pd.DataFrame([copy.deepcopy(r.to_dict())], index=[i])
n_df['col2'][i]["a"] = n_df['col2'][i]["a"] - 1
輸出:
>>> df
col1 col2
0 1 {'a': 5}
1 2 {'a': 8}
uj5u.com熱心網友回復:
根據定義
當 deep=True(默認)時,將使用呼叫物件的資料和索引的副本創建一個新物件。對副本的資料或索引的修改不會反映在原始物件中(請參閱下面的注釋)。
請注意,當復制包含 Python 物件的物件時,深復制將復制資料,但不會遞回地這樣做。更新嵌套資料物件將反映在深層副本中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467221.html
標籤:Python python-3.x 熊猫 数据框
上一篇:使用loc分配的熊貓
