假设我们有一个如下所示的 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)
我短:
这是一个已修复的错误。
如何解决这个问题以及行为的一些解释:
首先,为了使用字典将值分配到数据帧中,使用索引,您应该使用 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)
| 归档时间: |
|
| 查看次数: |
695 次 |
| 最近记录: |