将字典分配给列时的 df.loc 行为

rhu*_*123 7 python pandas

假设我们有一个如下所示的 df :

df = pd.DataFrame({'A': [3, 9, 3, 4], 'B': [7, 1, 6, 0], 'C': [9, 0, 3, 4], 'D': [1, 8, 0, 0]})
Run Code Online (Sandbox Code Playgroud)

开始 df:

   A  B  C  D
0  3  7  9  1
1  9  1  0  8
2  3  6  3  0
3  4  0  4  0
Run Code Online (Sandbox Code Playgroud)

如果我们想为 A 列分配新值,我希望以下内容能够工作:

d = {0:10,1:20,2:30,3:40}

df.loc[:,'A'] = d
Run Code Online (Sandbox Code Playgroud)

输出:

   A  B  C  D
0  0  7  9  1
1  1  1  0  8
2  2  6  3  0
3  3  0  4  0
Run Code Online (Sandbox Code Playgroud)

相反,分配的值是字典的键。

但是,如果我们不将字典分配给现有列,而是创建一个新列,则第一次运行时将得到相同的结果,但再次运行相同的代码将得到预期的结果。然后我们可以选择任何列,它将输出预期的输出。

第一次跑步df.loc[:,'E'] = {0:10,1:20,2:30,3:40}

输出:

   A  B  C  D  E
0  0  7  9  1  0
1  1  1  0  8  1
2  2  6  3  0  2
3  3  0  4  0  3
Run Code Online (Sandbox Code Playgroud)

第二次运行df.loc[:,'E'] = {0:10,1:20,2:30,3:40}

   A  B  C  D   E
0  0  7  9  1  10
1  1  1  0  8  20
2  2  6  3  0  30
3  3  0  4  0  40
Run Code Online (Sandbox Code Playgroud)

然后,如果我们运行与最初相同的代码,我们会得到不同的结果:

df.loc[:,'A'] = {0:10,1:20,2:30,3:40}
Run Code Online (Sandbox Code Playgroud)

输出:

    A  B  C  D   E
0  10  7  9  1  10
1  20  1  0  8  20
2  30  6  3  0  30
3  40  0  4  0  40
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?(我正在运行 pandas 版本 1.4.2)

Mat*_*dak 1

我短:

这是一个已修复的错误。

如何解决这个问题以及行为的一些解释:

首先,为了使用字典将值分配到数据帧中,使用索引,您应该使用 pd.Series(d)。

这是使用 pandas 1.4.4 的示例:

import pandas as pd

df = pd.DataFrame({'A': [3, 9, 3, 4], 'B': [7, 1, 6, 0], 'C': [9, 0, 3, 4], 'D': [1, 8, 0, 0]})

d = {0:10,1:20,2:30,3:40}

df.loc[:,'E'] = pd.Series({0:10,1:20,2:30,3:40})
df.loc[:,'F'] = {0:10,1:20,2:30,3:40}
df.loc[:,'G'] = {0:10,1:20,2:30,3:40}
df.loc[:,'G'] = {0:10,1:20,2:30,3:40}
df
Run Code Online (Sandbox Code Playgroud)

输出:

    A   B   C   D   E   F   G
0   3   7   9   1   10  0   10
1   9   1   0   8   20  1   20
2   3   6   3   0   30  2   30
3   4   0   4   0   40  3   40
Run Code Online (Sandbox Code Playgroud)

您第一次获得键的原因是使用“loc”分配给数据帧会强制使用列表(这会产生字典的键):

list({1:10,2:20,3:30,4:40})
Run Code Online (Sandbox Code Playgroud)

输出:

[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

和:

import pandas as pd
df = pd.DataFrame({'A': [3, 9, 3, 4], 'B': [7, 1, 6, 0], 'C': [9, 0, 3, 4], 'D': [1, 8, 0, 0]})
df.loc[:,'A'] = {11:10,12:20,13:30,14:40}
df
Run Code Online (Sandbox Code Playgroud)

输出:

    A   B   C   D
0   11  7   9   1
1   12  1   0   8
2   13  6   3   0
3   14  0   4   0
Run Code Online (Sandbox Code Playgroud)

使用 pandas 1.5.3 的输出

import pandas as pd
df = pd.DataFrame({'A': [3, 9, 3, 4], 'B': [7, 1, 6, 0], 'C': [9, 0, 3, 4], 'D': [1, 8, 0, 0]})
df.loc[:,'A'] = {0:10,1:20,2:30,3:40}
df
Run Code Online (Sandbox Code Playgroud)

输出:

index, A    B   C   D
0   10  7   9   1
1   20  1   0   8
2   30  6   3   0
3   40  0   4   0
Run Code Online (Sandbox Code Playgroud)