【问题标题】:Missing data in pandas.crosstabpandas.crosstab 中缺少数据
【发布时间】:2014-01-14 18:18:33
【问题描述】:

我正在用 pandas 制作一些交叉表:

a = np.array(['foo', 'foo', 'foo', 'bar', 'bar', 'foo', 'foo'], dtype=object)
b = np.array(['one', 'one', 'two', 'one', 'two', 'two', 'two'], dtype=object)
c = np.array(['dull', 'dull', 'dull', 'dull', 'dull', 'shiny', 'shiny'], dtype=object)

pd.crosstab(a, [b, c], rownames=['a'], colnames=['b', 'c'])

b     one   two       
c    dull  dull  shiny
a                     
bar     1     1      0
foo     2     1      2

但我真正想要的是以下内容:

b     one        two       
c    dull  shiny dull  shiny
a                     
bar     1     0    1      0
foo     2     0    1      2

我通过添加新列并将级别设置为新的 MultiIndex 找到了解决方法,但这似乎很困难......

有没有办法将 MultiIndex 传递给交叉表函数来预定义输出列?

【问题讨论】:

  • “似乎很难”是一种光荣的轻描淡写:)

标签: python pandas


【解决方案1】:

crosstab 函数有一个名为 dropna 的参数,默认设置为 True。此参数定义是否应显示空列(例如单亮列)。

我尝试这样调用函数:

pd.crosstab(a, [b, c], rownames=['a'], colnames=['b', 'c'], dropna = False)

这就是我得到的:

b     one          two       
c    dull  shiny  dull  shiny
a                            
bar     1      0     1      0
foo     2      0     1      2

希望这仍然有帮助。

【讨论】:

    【解决方案2】:

    我认为没有办法做到这一点,crosstab 在源代码中调用 pivot_table,它似乎也没有提供这个。 我将其作为问题提出here

    一个 hacky 解决方法(可能与您已经使用的相同也可能不同...):

    from itertools import product
    ct = pd.crosstab(a, [b, c], rownames=['a'], colnames=['b', 'c'])
    a_x_b = list(product(np.unique(b), np.unique(c)))
    a_x_b = pd.MultiIndex.from_tuples(a_x_b)
    
    In [15]: ct.reindex_axis(a_x_b, axis=1).fillna(0)
    Out[15]:
          one          two
         dull  shiny  dull  shiny
    a
    bar     1      0     1      0
    foo     2      0     1      2
    

    如果product 太慢,这里是a numpy implementation

    【讨论】:

    • 我在issue 3439 中包含了这个示例,因为我认为一个问题是,文档描述了一些错误。
    • 我的做法基本相同。我认为我的问题是在熊猫中使用的方法。交叉表函数完成了预期的工作。所以下一个问题是:我如何通过 MultiIndex 对数据进行分组?我的意思是传递给 groupby 的不仅仅是键,还有键和值。
    • @norecces implementation 只使用 pivot_table。 (你应该作为一个单独的问题问,我认为你可以结合映射和列。)
    猜你喜欢
    • 2012-11-25
    • 2014-03-14
    • 2020-06-08
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多