当附加到 Pandas DataFrame 中字典中的列表时,它附加到列中的所有字典而不是我指向的字典
When appending to a list within a dictionary within a Pandas DataFrame, it appends to all dictionaries in column instead of the one I'm pointing to
这是我的代码
import pandas as pd
keys = ['phone match', 'account match']
d = {k: [] for k in keys}
df = pd.DataFrame(data=[[1,2,3],[4,5,6]],columns=['A','B','C'])
df['D'] = [d for _ in range(df.shape[0])]
df.at[0, 'D']['phone match'].append(4)
但它不是仅追加到索引 0 处的字典,而是追加到所有字典,因此输出是:
A B C D
0 1 2 3 {'phone match': [4], 'account match': []}
1 4 5 6 {'phone match': [4], 'account match': []}
虽然所需的输出是:
A B C D
0 1 2 3 {'phone match': [4], 'account match': []}
1 4 5 6 {'phone match': [], 'account match': []}
我认为这是因为 python 链接到同一个词典,但我该如何避免呢?
您需要创建多个 dict
以使每个对象具有不同的对象 ID
keys = ['phone match', 'account match']
df = pd.DataFrame(data=[[1,2,3],[4,5,6]],columns=['A','B','C'])
df['D'] = [{k: [] for k in keys} for _ in range(df.shape[0])] # Change here
df.at[0, 'D']['phone match'].append(4)
df
Out[65]:
A B C D
0 1 2 3 {'phone match': [4], 'account match': []}
1 4 5 6 {'phone match': [], 'account match': []}
dict
对象在 python 中通过引用传递。
为了实现您想要的效果,您可以使用以下行,它为每一行创建一个 d 的副本:
df['D'] = [d.copy() for _ in range(df.shape[0])]
这是我的代码
import pandas as pd
keys = ['phone match', 'account match']
d = {k: [] for k in keys}
df = pd.DataFrame(data=[[1,2,3],[4,5,6]],columns=['A','B','C'])
df['D'] = [d for _ in range(df.shape[0])]
df.at[0, 'D']['phone match'].append(4)
但它不是仅追加到索引 0 处的字典,而是追加到所有字典,因此输出是:
A B C D
0 1 2 3 {'phone match': [4], 'account match': []}
1 4 5 6 {'phone match': [4], 'account match': []}
虽然所需的输出是:
A B C D
0 1 2 3 {'phone match': [4], 'account match': []}
1 4 5 6 {'phone match': [], 'account match': []}
我认为这是因为 python 链接到同一个词典,但我该如何避免呢?
您需要创建多个 dict
以使每个对象具有不同的对象 ID
keys = ['phone match', 'account match']
df = pd.DataFrame(data=[[1,2,3],[4,5,6]],columns=['A','B','C'])
df['D'] = [{k: [] for k in keys} for _ in range(df.shape[0])] # Change here
df.at[0, 'D']['phone match'].append(4)
df
Out[65]:
A B C D
0 1 2 3 {'phone match': [4], 'account match': []}
1 4 5 6 {'phone match': [], 'account match': []}
dict
对象在 python 中通过引用传递。
为了实现您想要的效果,您可以使用以下行,它为每一行创建一个 d 的副本:
df['D'] = [d.copy() for _ in range(df.shape[0])]