pandas:基于列表中的值进行分组或过滤,而不是数据帧

时间:2016-06-23 18:53:28

标签: python pandas

我希望得到每个值的频率的行数,即使数据帧中不存在该值。

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()对象,它根据列表中的值而不是数据框中的列对事物进行分组?或者有更好的方法吗?

1 个答案:

答案 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