Pandas多级索引:将浮点数转换为字符串

4
pd.__version__
'0.15.2'

我有一个带有三个层级的多索引熊猫数据框。当我连接两个数据框时,它将最低索引转换为浮点数,而它应该是一个字符串。

我尝试使用

.0

替换为空来解决这个问题。

在此输入图片描述

在此输入图片描述

idx=str(dfmaster_stats.index.levels[2]).replace('.0', '')

在此输入图像描述 并将其分配给数据框,但我遇到了这个错误

TypeError: 'FrozenList' does not support mutable operations.

我查看了其他问题并发现多重索引无法更改,因此我尝试重新索引数据框。我遵循了这个问题,但是两种解决方案都不起作用。 Pandas: Modify a particular level of Multiindex 它肯定看起来不对。我做错了什么? enter image description here 我还尝试了set_levels,但不确定语法。
dfmaster_stats.index.set_levels(dfmaster_stats.index.levels[2](idx), level =2)

给我这个错误

TypeError: 'Index' object is not callable

像这样吗?https://dev59.com/jFsW5IYBdhLWcg3w8q_2 - Evan
@evan 我认为我也尝试了这个 dfmaster_stats.index = dfmaster_stats.index.set_levels([idx.levels[:2], idx.levels[2].astype(str)].replace('.0', '')) 但我收到了错误信息 AttributeError: 'str' object has no attribute 'levels' - davidhmpham
我将尝试使用数据透视表重新创建我的整个多级索引,而不是使用groupby,并查看是否有所不同。 - davidhmpham
1个回答

5

正如其他帖子中提到的那样,更容易的方法可能是重置索引、更改数据类型并设置新的索引。

np.random.seed(0)
tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',
                     'foo', 'foo', 'qux', 'qux'],
                      [1.0, 2.0, 1.0, 2.0,
                       1.0, 2.0, 1.0, 2.0]]))

idx = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(8, 2), index=idx, columns=['A', 'B'])

print(df)
print(df.index.get_level_values("second").dtype)

输出:

                         A         B
first second                    
bar   1.0     1.764052  0.400157
      2.0     0.978738  2.240893
baz   1.0     1.867558 -0.977278
      2.0     0.950088 -0.151357
foo   1.0    -0.103219  0.410599
      2.0     0.144044  1.454274
qux   1.0     0.761038  0.121675
      2.0     0.443863  0.333674
float64

现在,重置索引、更改数据类型并设置新的索引。

df = df.reset_index()
df["second"] = df["second"].astype(int).astype(str)
df = df.set_index(["first", "second"])

print(df)
print(df.index.get_level_values("second").dtype)

输出:

                     A         B
first second                    
bar   1       1.764052  0.400157
      2       0.978738  2.240893
baz   1       1.867558 -0.977278
      2       0.950088 -0.151357
foo   1      -0.103219  0.410599
      2       0.144044  1.454274
qux   1       0.761038  0.121675
      2       0.443863  0.333674
object

总的来说,我发现操作多层索引有时值得努力,有时不值得。更改级别会显得冗长。如果你致力于解决问题,这种方法是可行的:

idx0 = df.index.levels[0]
idx1 = df.index.levels[1].astype(str).str.replace('.0', '')

df.index = df.index.set_levels([idx0, idx1])
print(df.index.levels[1].dtype)

输出:

object

如果您提供创建数据框的示例代码,我可以将其扩展到3个级别,或者您也可以自己解决。 :)


请注意,pandas MultiIndex 的 levels 属性似乎按字典顺序对各个级别进行排序(可以在 OP 的屏幕截图中看到)。这将重新排序给定级别的索引标签,而不保留 MultiIndex 元组。 (使用 astype(str) 转换为 str 时也会发生这种情况)。 - onietosi
熊猫开发者们:请允许我们执行df.set_index(df.index.astype(types_dict))操作。 - Attila the Fun
熊猫开发者们:请让我们执行df.set_index(df.index.astype(types_dict))操作。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接