我有以下数据:
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 中执行此操作?我尝试了一个数据透视表,但无法让它解释数据中可能缺失的值。
使用数据透视表:
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)
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