意外地通过df.loc和单元素列表分配pandas

时间:2018-01-10 21:00:46

标签: python pandas

当我通过df.loc方法和包含单个元素的列表为DataFrame指定新值时,pandas的行为与我预期的不同。

例如(在python 3.6和pandas 0.22.0中):

import pandas as pd
df = pd.DataFrame([[1,2,3]],columns=["A", "B", "C"])

# a list has two or more elements
df.loc[0, ["A", "B"]] = ["X", "Y"]
df
   A  B  C
0  X  Y  3

# a list has single element
df.loc[0, ["C"]] = ["Z"]

正如我所料

df
   A  B  C
0  X  Y  Z

但结果是

df
   A  B    C
0  X  Y  [Z]

这种行为是否符合熊猫的实施?

我想以相同的方式分配值,而与列表中的元素数量无关。

1 个答案:

答案 0 :(得分:0)

似乎不建议按列表分配值。

c.f https://github.com/pandas-dev/pandas/issues/16864

相反,我将使用元素方法如下:

for i, v in enumerate(["X", "Y", "Z"]):
    df.loc[0, ["A", "B", "C"]][i] = v

感谢所有评论!

编辑:

以上代码不起作用。它无法替换df中的值。 (但如果 df.loc [0,[" A"," B"," C"]] 被pd.Series取代。)

修订后的代码是

for c, v in zip(["A", "B", "C"], ["X", "Y", "Z"]):
    df.loc[0, c] = v