如何显示pandas DataFrame中元素的频率?

时间:2019-03-09 14:12:23

标签: python pandas dataframe pandas-groupby

我有一个包含以下列的pandas DataFrame(具有现有的数字索引):

    points | variety
    ----------------
1       97 | Chardonnay
17      67 | Cabernet Sauvignon
12      70 | Cabernet Sauvignon
8       97 | Chardonnay

我想通过以下方式将其转换为新的DataFrame:

  • points列作为新索引
  • variety列中每个唯一条目的一列
  • 新品种名称列中的值包含原始表中原始points值每个品种出现的频率。

例如来自上面的示例:

    Chardonnay | Cabernet Sauvignon
    -------------------------------
97           2 | 0
67           0 | 1
70           0 | 1

请注意,原始索引与输出无关。这是显示更完整示例的图片:Pandas DataFrame Snapshot

2 个答案:

答案 0 :(得分:1)

您可以为此使用Pandas.crosstab

{
   extend: 'excelHtml5',
   autoFilter: true,
   sheetName: 'Exported data'
}

[出]

pd.crosstab(index=df.points, columns=df.variety)

答案 1 :(得分:0)

假设您的数据存储在带有“点”和“种类”列的数据框中

df = pd.DataFrame({"points": [97, 67, 70, 97], 
                   "variety": ["Chardonnay", "Cabernet Sauvignon", 
                               "Cabernet Sauvignon", "Chardonnay"]})

那你想要的就是

result = df.groupby(["points", "variety"]).size().unstack().fillna(0)

打印result给出

variety  Cabernet Sauvignon  Chardonnay
points                                 
67                      1.0         0.0
70                      1.0         0.0
97                      0.0         2.0

我假设列的顺序无关紧要。如果是这样,只需使用result = result.loc[:, new_col_order]重新排序即可,其中 new_col_order = ["Chardonnay", ..., ]是品种正确顺序的列表。