Python 每年统计熊猫数据帧中的类似字符串值

Python 每年统计熊猫数据帧中的类似字符串值,python,pandas,pivot-table,Python,Pandas,Pivot Table,拥有下面的数据集。我想数一数某一年出现的字符串。事实上,我有一个大得多的数据框架多年。如何组合groupby方法并计算不同的字符串值 df=pd.DataFrame(数据={'col1':['A','B','D','A','col2':['B','C','E','E','E','E'],'col3':['C','D','','','col4':['D','E','','A',索引=['01-01-2000','02-01-2001','02-01-2001']) 预期结果:

拥有下面的数据集。我想数一数某一年出现的字符串。事实上,我有一个大得多的数据框架多年。如何组合groupby方法并计算不同的字符串值

df=pd.DataFrame(数据={'col1':['A','B','D','A','col2':['B','C','E','E','E','E'],'col3':['C','D','','','col4':['D','E','','A',索引=['01-01-2000','02-01-2001','02-01-2001'])

预期结果:

           count
A    2000    1
A    2001    1
B    2000    2    
B    2001    0
C    2000    2
C    2001    0
D    2000    2
D    2001    1
E    2000    1
E    2001    2


您可以在中创建新列
year
,然后按重塑、按删除空字符串、按获取计数、按添加缺少的类别和上次使用:


首先,让我们用空值替换空单元格(例如,
np.nan
),并将索引设置为:

(我还更改了代码以适合您问题中的示例)

要获得结果,请执行以下操作:

result = df.apply(lambda row: row.value_counts(), axis=1).resample('1Y').sum().stack().reorder_levels([1, 0]).sort_index()
这将产生:

A  2000-12-31    1.0
   2001-12-31    1.0
B  2000-12-31    2.0
   2001-12-31    0.0
C  2000-12-31    2.0
   2001-12-31    0.0
D  2000-12-31    2.0
   2001-12-31    1.0
E  2000-12-31    1.0
   2001-12-31    2.0
让我们把它分解一下:

  • df.apply(lambda row:row.value_counts(),axis=1)
    将数据帧转换为列中的“A”到“E”,以及单元格中的出现次数:

                A   B   C   D   E
    2000-01-01  1.0 1.0 1.0 1.0 NaN
    2000-02-01  NaN 1.0 1.0 1.0 1.0
    2001-01-01  NaN NaN NaN 1.0 1.0
    2001-02-01  1.0 NaN NaN NaN 1.0
    
  • .resample('1Y').sum()
    正在使用,这只是一种很好地处理日期时间索引的幻想,可以按年份对事件进行求和。它产生:

                A   B   C   D   E
    2000-12-31  1.0 2.0 2.0 2.0 1.0
    2001-12-31  1.0 0.0 0.0 1.0 2.0
    
  • ,和sort_index只是将结果转换为所需的格式(好吧,几乎……注意,它显示的不是一年,而是该年的最后一天)


示例代码不会在帖子中生成示例df…该代码生成的数据帧与您显示的数据帧不同。
A  2000-12-31    1.0
   2001-12-31    1.0
B  2000-12-31    2.0
   2001-12-31    0.0
C  2000-12-31    2.0
   2001-12-31    0.0
D  2000-12-31    2.0
   2001-12-31    1.0
E  2000-12-31    1.0
   2001-12-31    2.0
            A   B   C   D   E
2000-01-01  1.0 1.0 1.0 1.0 NaN
2000-02-01  NaN 1.0 1.0 1.0 1.0
2001-01-01  NaN NaN NaN 1.0 1.0
2001-02-01  1.0 NaN NaN NaN 1.0
            A   B   C   D   E
2000-12-31  1.0 2.0 2.0 2.0 1.0
2001-12-31  1.0 0.0 0.0 1.0 2.0