我希望得到每个值的频率的行数,即使数据帧中不存在该值。
d = {'light' : pd.Series(['b','b','c','a','a','a','a'], index=[1,2,3,4,5,6,9]),'injury' : pd.Series([1,5,5,5,2,2,4], index=[1,2,3,4,5,6,9])}
testdf = pd.DataFrame(d)
injury light
1 1 b
2 5 b
3 5 c
4 5 a
5 2 a
6 2 a
9 4 a
我希望计算'light'中每个唯一值的'伤害'每个唯一值的出现次数。
通常情况下,我会使用groupby()
或(在这种情况下,因为我希望它采用特定格式),pivot_table:
testdf.reset_index().pivot_table(index='light',columns='injury',fill_value=0,aggfunc='count')
index
injury 1 2 4 5
light
a 0 2 1 1
b 1 0 0 1
c 0 0 0 1
但在这种情况下,我实际上想要将数据框中的记录与外部值列表进行比较 - 在本例中为['a','b','c','d']
。因此,如果此数据帧中不存在“d”,那么我希望它返回零计数:
index
injury 1 2 4 5
light
a 0 2 1 1
b 1 0 0 1
c 0 0 0 1
d 0 0 0 0
我最接近的是根据每个值过滤数据帧,然后获取该数据帧的大小:
for v in sorted(['a','b','c','d']):
idx2 = (df['light'].isin([v]))
df2 = df[idx2]
print(df2.shape[0])
4
2
1
0
但这只会从“轻量级”列返回计数 - 而不是两列的交叉列表。
有没有办法制作数据透视表或groupby()
对象,它根据列表中的值而不是数据框中的列对事物进行分组?或者有更好的方法吗?
答案 0 :(得分:0)
试试这个:
df = pd.crosstab(df.light, df.injury,margins=True)
df
injury 1 2 4 5 All
light
a 0 2 1 1 4
b 1 0 0 1 2
c 0 0 0 1 1
All 1 2 1 3 7
df["All"]
light
a 4
b 2
c 1
All 7