带有计数值的 Pandas DataFrame

问题描述 投票:0回答:2

我有以下数据:

data = [{'Shape': 'Circle', 'Color': 'Green'}, {'Shape': 'Circle', 'Color': 'Green'}, {'Shape': 'Circle', 'Color': 'Green'}]

我从中创建了一个 DataFrame:

df = pd.DataFrame(data)

给予:

>>> df
    Shape  Color
0  Circle  Green
1  Circle  Green
2  Circle  Green

数据总是以这种形式接收,我无法更改它。

现在我需要计算每个

Color
Shape
列,以
Color
作为索引,如下所示:

       Circle  Square
Green       3       0
Red         0       0

但是,虽然我知道

Shape
可以是
Circle
Square
,但它们可能会也可能不会出现在数据中。同样,
Color
可以是
Green
Red
,但也可能出现或不出现在数据中。

所以目前我的解决方案是使用:

df2 = pd.DataFrame(
    [
        {
            "Color": "Green",
            "Circle": len(np.where((df["Shape"] == "Circle") & (df["Color"] == "Green"))[0]),
            "Square": len(np.where((df["Shape"] == "Square") & (df["Color"] == "Green"))[0]),
        },
        {
            "Color": "Red",
            "Circle": len(np.where((df["Shape"] == "Circle") & (df["Color"] == "Red"))[0]),
            "Square": len(np.where((df["Shape"] == "Square") & (df["Color"] == "Red"))[0]),
        },
    ]
)
df2 = df2.set_index("Color")
df2.index.name = None

这给出了所需的结果:

>>> df2
       Circle  Square
Green       3       0
Red         0       0

但我怀疑这是低效的。有没有更好的方法直接在 Pandas 中执行此操作?我尝试了一个数据透视表,但无法让它解释数据中可能缺失的值。

python pandas dataframe
2个回答
0
投票

使用数据透视表:

data = [{'Shape': 'Circle', 'Color': 'Green'}, 
        {'Shape': 'Circle', 'Color': 'Green'}, 
        {'Shape': 'Circle', 'Color': 'Green'}]
df = pd.DataFrame(data)

shapes = ['Circle', 'Square']
colors = ['Green', 'Red']

pivot_table = df.pivot_table(index='Color', 
                             columns='Shape', 
                             aggfunc='size', 
                             fill_value=0)

pivot_table = pivot_table.reindex(index=colors, 
                                  columns=shapes, 
                                  fill_value=0)

0
投票

crosstab
DataFrame.reindex
:

out = (pd.crosstab(df['Color'], df['Shape'])
         .reindex(index=['Green','Red'], 
                  columns=['Circle','Square'], fill_value=0))
print (out)
Shape  Circle  Square
Color                
Green       3       0
Red         0       0
© www.soinside.com 2019 - 2024. All rights reserved.