import pandas as pd
df = pd.DataFrame([[0,0], [0,0]], index=['a', 'b'])
df.columns = [(1,2), (3,4)]
df.at['a', (1,2)] = 100
print(df)
我的列名称是一个元组,我想将值 100 设置为其中一个单元格。预期结果是
(1, 2) (3, 4)
a 100 0
b 0 0
但我得到了
(1, 2) (3, 4) 1 2
a 0 0 100.0 100.0
b 0 0 NaN NaN
即,pandas 将元组视为两个新列。我也尝试过
.loc
并得到了相同的结果。
实际上这似乎取决于IDE,因为在Jupternote中,它是第一个。但在pycharm中,却变成了意想不到的事情。
您的代码应该可以与
at
正常工作,因为此选择器旨在访问单个值。版本 1.0.3、1.4.3、1.5.3 和 2.1.4 都正确分配了值。
问题出现在
df.loc['a', (1,2)] = 100
上,它使用 pandas 1.0.3 分配给您的单个单元格,但广播到所有其他版本的新列。
为了避免歧义,您应该将元组包装在列表中:
df.loc['a', [(1,2)]] = 100
输出:
(1, 2) (3, 4)
a 100 0
b 0 0
如果你想比较不同的 pandas 版本,请尝试:
import pandas as pd
print(pd.__version__)
df = pd.DataFrame([[0,0], [0,0]], index=['a', 'b'])
df.columns = [(1,2), (3,4)]
df.at['a', (1,2)] = 100
print("df.at['a', (1,2)] = 100")
print(df)
df = pd.DataFrame([[0,0], [0,0]], index=['a', 'b'])
df.columns = [(1,2), (3,4)]
df.loc['a', (1,2)] = 100
print("df.loc['a', (1,2)] = 100")
print(df)
df = pd.DataFrame([[0,0], [0,0]], index=['a', 'b'])
df.columns = [(1,2), (3,4)]
df.loc['a', [(1,2)]] = 100
print("df.loc['a', [(1,2)]] = 100")
print(df)