数据框元组名称列设置值

问题描述 投票:0回答:1
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中,却变成了意想不到的事情。

python pandas dataframe
1个回答
0
投票

您的代码应该可以与

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)
© www.soinside.com 2019 - 2024. All rights reserved.