具有 value_counts 的 Pandas groupby 并在新数据框中生成列

杰克莫里斯

给定一个带有特定事件“名称”的数据框,它发生的年份及其类型,如下所示:

index  name  year  type  extracolumns
  0    'a'   2014  'X'     stuff
  1    'a'   2014  'X'     stuff
  2    'a'   2014  'Y'     stuff
  3    'a'   2014  'Y'     stuff
  4    'a'   2015  'X'     stuff
  5    'a'   2015  'X'     stuff
  6    'a'   2015  'Y'     stuff
  7    'b'   2014  'X'     stuff
  8    'b'   2015  'Y'     stuff
  9    'c'   2014  'Z'     stuff

我想要一个由事件的“名称”索引的数据框,它按年份对每个“类型”进行计数。理想情况下,它看起来像:

index  type_X_2014  type_Y_2014  type_Z_2014  type_X_2015  type_Y_2015  type_Z_2015
 'a'        2            2            0             2           1           0
 'b'        1            0            0             0           1           0
 'c'        0            0            1             0           0           0

这应该有 nunique(types)*nunique(years) 列。显然,这将涉及 groupby 和一些 value_counts。有没有一种方法可以动态完成此操作,而无需对列名进行硬编码?非常感谢。

忘了它

您可以使用pd.crosstab创建频率表:

import sys
import pandas as pd
pd.options.display.width = sys.maxsize
df = pd.DataFrame({'extracolumns': ['stuff', 'stuff', 'stuff', 'stuff', 'stuff', 'stuff', 'stuff', 'stuff', 'stuff', 'stuff'], 'index': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 'name': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'c'], 'type': ['X', 'X', 'Y', 'Y', 'X', 'X', 'Y', 'X', 'Y', 'Z'], 'year': [2014, 2014, 2014, 2014, 2015, 2015, 2015, 2014, 2015, 2014]}) 

result = pd.crosstab(df['name'], [df['year'], df['type']], dropna=False)
result.columns = ['type_{}_{}'.format(typ,year) for year,typ in result.columns]

print(result)

产量

      type_X_2014  type_Y_2014  type_Z_2014  type_X_2015  type_Y_2015  type_Z_2015
name                                                                              
a               2            2            0            2            1            0
b               1            0            0            0            1            0
c               0            0            1            0            0            0

如果您不想对列名进行硬编码,但您知道列的位置(序数索引),那么您可以使用iloc按位置引用列:

result = pd.crosstab(df.iloc[:,1], [df.iloc[:, 2], df.iloc[:, 3]])

即使所有频率都为零,仍保留列dropna=False原因crosstab这确保了有nunique(types)*nunique(years)列——包括type_Z_2015.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python Pandas 計算兩列的 value_counts 並使用 groupby

根据列value_counts(pandas)过滤数据框

是否有一个 python 函数可以为带有列表的 Pandas 数据框列获取 `value_counts()`?

熊猫value_counts包括groupby之前的所有值

对 value_counts() 返回的 groupby 列值求和

使用 dataframe pandas 中的 value_counts 创建新列

使用 value_counts 和多列过滤 Pandas DataFrame?

在pandas中使用value_counts()追加列

在同一行中具有多个匹配项的Pandas value_counts()

Pandas:value_counts 并使用 groupby 多索引进行切割

在Pandas groupby上使用value_counts时,如何忽略空序列?

使用Pandas GroupBy和value_counts查找最常见的值

更改groupby和value_counts输出以映射到数据框

使用value_counts()在groupby结果之后旋转数据框

为groupby中的每个组将value_counts()的索引添加到新列

如何在pandas数据框列中找到value_counts()的长度大于1的长度

如何使用 value_counts 从列表中选择具有特定值的数据

groupby 和 value_counts() 的所有可能性,Multiindex 问题

DataFrame.groupby(column).apply(len)和DataFrame [column] .value_counts()有什么区别?

熊猫groupby和value_counts

使用groupby在多列上的Value_counts

使用 GroupBy 和 value_counts

如何在具有许多列的pandas数据框中生成列的所有可能组合?

数据分组具有多级列索引的Pandas groupby

如何在 Pandas 数据框中使用 value_counts 绘制饼图?

Python Pandas:将“ .value_counts”输出转换为数据框

将Pandas groupby转换为具有带有布尔值列的数据框

如何将 value_counts() 值附加到 Pandas 中的新列

如何在Pandas Dataframe中的所有值中进行value_counts