【问题标题】:Reshape the table to get the frequency of each unique value重塑表格以获取每个唯一值的频率
【发布时间】:2020-01-20 22:20:16
【问题描述】:

我有时间索引数据:

df2 = pd.DataFrame({ 'day': pd.Series([date(2012, 1, 1), date(2012, 1, 3), date(2012, 1, 5)]), 'a' : pd.Series(['A', 'B', 'C']),
                   'b': pd.Series(['C', 'E', 'C']), 'c': pd.Series(['E', 'F', 'A']), 'd': pd.Series(['B', np.nan, 'E'])})
df2 = df2.set_index('day')
df2

            a   b   c   d
day         
2012-01-01  A   C   E   B 
2012-01-03  B   E   F   NaN
2012-01-05  C   C   A   E

重塑表格以获得每天每个唯一值的频率的最佳方法是什么?

例如,A 在 1/01 和 1/05 出现一次。

所以想要的结果是:

            A   B   C   D   E   F  NaN
day         
2012-01-01  1   1   1   0   1   0   0
2012-01-03  0   1   0   0   1   1   1
2012-01-05  1   0   2   0   1   0   0

非常感谢!

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:
df3 = df2.melt('day').pivot_table(index = 'day', columns = 'value', aggfunc= np.size, fill_value = 0)
df3.columns = df3.columns.droplevel(0)
df3.columns.name = None


            A   B   C   D   E   F
day                     
2012-01-01  1   1   1   0   1   0
2012-01-03  0   1   0   0   1   1
2012-01-05  1   0   1   1   1   0

您可以先融化,然后再进行支点,以获得我认为您正在寻找的东西。

编辑


这种方式更简洁,我没想到

df3 = df2.melt('day')
df3 = pd.crosstab(df3['day'], df3['value'])
df3.columns.name = None

【讨论】:

  • 非常感谢您的快速回复!你的回答很好! melt + pivot_table 看起来非常强大。
  • 谢谢,我忘了在处理计数时你可以使用交叉表,查看我的编辑以获得更简单的代码。它基本上做同样的事情。
  • 我也试过 stack('day') + crosstab,它可以解决这个问题,但似乎不够优雅,因为你的 melt('day') + crosstab
【解决方案2】:

让我们尝试使用 pd.get_dummies,并与 level 参数求和:

df2 = pd.DataFrame({ 'day': pd.Series([date(2012, 1, 1), date(2012, 1, 3), date(2012, 1, 5)]), 'a' : pd.Series(['A', 'B', 'C']),
                   'b': pd.Series(['C', 'E', 'C']), 'c': pd.Series(['E', 'F', 'A']), 'd': pd.Series(['B', np.nan, 'E'])})
df2 = df2.set_index('day')

df2 = df2.fillna('NaN')
df_out = pd.get_dummies(df2, prefix='', prefix_sep='').T.sum(level=0).T
print(df_out)

输出:

            A  B  C  E  F  NaN
day                           
2012-01-01  1  1  1  1  0    0
2012-01-03  0  1  0  1  1    1
2012-01-05  1  0  2  1  0    0

您可以对列进行分组,而不是 T.sum(level=0).T。

df_out = pd.get_dummies(df2, prefix='', prefix_sep='')
df_out = df_out.groupby(df_out.columns, axis=1).sum()

【讨论】:

    【解决方案3】:

    一个简单的方法是使用 pandas 提供的 get_dummies 方法

    如:

    import pandas as pd
    pd.get_dummies(df2, dummy_na=True)
    

    输出

               a_A  a_B a_C a_nan   b_C b_D b_E b_nan   c_A c_E c_F c_nan   d_B d_E d_nan
    day                                                         
    2012-01-01  1   0   0    0     1    0   0   0      0    1   0   0      1    0   0
    2012-01-03  0   1   0    0     0    0   1   0      0    0   1   0      0    0   1
    2012-01-05  0   0   1    0     0    1   0   0      1    0   0   0      0    1   0
    

    然后您可以重命名列并将它们组合起来。

    【讨论】:

      猜你喜欢
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多