相当于countifs的熊猫

时间:2019-11-28 21:10:58

标签: python pandas

以下是一个大型excel表的一小部分摘录,其中包含数周的数据:

                                                 Q
+--------------+--------------------------+------------+
|   Keyword    |        searches          |    KW45    |
+--------------+--------------------------+------------+
| durni coat   |                      110 |          1 |
| gliss coat   |                       40 |          2 |
| hart coat    |                       70 |          7 |
| kepla coat   |                       50 |          3 |
| lasox coat   |                        0 |          1 |
| magna coat   |                       10 |            |
| magoxid coat |                       10 |          2 |
| plasma coat  |                       50 |          3 |
| selga coat   |                        0 |          1 |
| sila coat    |                        0 |         25 |
| temp coat    |                       10 |         50 |
+--------------+--------------------------+------------+


目前我在Excel的C列中使用这些功能:

    =COUNTIFS(Q:Q;"=1";;INDEX($Q:$T;;MATCH(C1;$Q$1:$T$1;0));">0")
    =COUNTIFS(Q:Q;"=2";;INDEX($Q:$T;;MATCH(C1;$Q$1:$T$1;0));">0")
    =COUNTIFS(Q:Q;"=3";;INDEX($Q:$T;;MATCH(C1;$Q$1:$T$1;0));">0")
    =COUNTIFS(Q:Q;">=4";Q:Q;"<=5";INDEX($Q:$T;;MATCH(C1;$Q$1:$T$1;0));">0")
    =COUNTIFS(Q:Q;">=6";Q:Q;"<=10";INDEX($Q:$T;;MATCH(C1;$Q$1:$T$1;0));">0")
    =COUNTIFS(Q:Q;">=11";Q:Q;"<=20";INDEX($Q:$T;;MATCH(C1;$Q$1:$T$1;0));">0")
    =COUNTIFS(Q:Q;">=21";Q:Q;"<=30";INDEX($Q:$T;;MATCH(C1;$Q$1:$T$1;0));">0")
and so on....

匹配星期和位置范围以创建下表:


    |    B       |   C  | 
    | Position   | KW45 | 
    |------------|------|
    | Pos. 1     | 3    | 
    | Pos. 2     | 2    | 
    | Pos. 3     | 2    | 
    | Pos. 4-5   | 0    |
    | Pos. 6-10  | 1    |
    | Pos. 11-20 | 0    |
    | Pos. 21-30 | 1    |
    | Pos. 31-40 | 0    |
    | Pos. 41-50 | 1    |


我该如何在熊猫中实现上述功能?

我的目标是统计发生次数:

value 1 in column Q
value 2 in column Q
value 3 in column Q
value range 4-5 in column Q
value range 6-10 in column Q
value range 11-20 in column Q

and so on... 

2 个答案:

答案 0 :(得分:2)

我的目标是统计发生次数

void get_movie_info(movie_data& movie1, movie_data& movie2)
void movie_display(const movie_data& movie1, const movie_data& movie2)

输出:

(pd.cut(df['KW45'], bins=[0, 1, 2, 3, 5, 10, 20, 30, 40, 50])
   .value_counts(sort=False)
)

答案 1 :(得分:0)

我想我了解这一点-为什么不使用np.where()和sum() 所以从您的示例中-将excel导入为数据框

+---------+------------+------------------+------------+
| Entity  | Sub_Entity |       Year       | Proportion |
+---------+------------+------------------+------------+
| 1000160 |     855960 | 1962             | 0.6        |
| 1000160 |     855960 | .                | 0.6        |
| 1000160 |     855960 | .                | 0.6        |
| 1000160 |     855960 | 2008             | 0.6        |
| 1000203 |     054453 | 1972             | 0.07       |
| 1000203 |     054453 | .                | 0.07       |
| 1000203 |     054453 | .                | 0.07       |
| 1000203 |     054453 | 2017             | 0.07       |
| 1000203 |     739846 | 1972             | 0.07       |
| 1000203 |     739846 | .                | 0.07       |
| 1000203 |     739846 | .                | 0.07       |
| 1000203 |     739846 | 2017             | 0.07       |
| 1000203 |     547953 | 1972             | 3.33       |
| 1000203 |     547953 | .                | 3.33       |
| 1000203 |     547953 | .                | 3.33       |
| 1000203 |     547953 | 2017             | 3.33       |
| 1000203 |     984244 | 1972             | 3.33       |
| 1000203 |     984244 | .                | 3.33       |
| 1000203 |     984244 | .                | 3.33       |
| 1000203 |     984244 | (This Year 2019) | 3.33       |
|         |            |                  |            |
+---------+------------+------------------+------------+

然后创建计数(或范围)列---

df = pd.read_excel('path_here')

或者只是求和

#Syntax for np.where 
#column = np.where(condition, if_true, if_false)

#Creates a cumulative count
df['val1_sum'] = np.where(df['Q'] == value1,1,0).cumsum()

我喜欢简单,模块化的方法-而且很容易理解。

如果要计算很多不同的值,我将使用带multii-index的count()或nunique()-这不能解决范围问题,但是您可以使用np.where()进一步过滤 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.count.html

Count unique values with pandas per groups

sum_val1 = np.where(df['Q'[ == value1, 1, 0).sum()

#Range based 
range_1 = np.where((df['Q'] > 5) & (df['Q'] <= 10),1,0).sum()