值计数数据帧具有不同的数据帧并导致不同的列(pandas)

时间:2018-03-23 13:12:16

标签: python pandas dataframe count

我对python / pandas比较陌生。 我有两个数据帧,我想合并在一起。 第一个数据框看起来像:

var1      var2
EA-0123   A01
EC-0124   A03
EC-0124   A03
ED-0125   A02
ED-0125   A01

和第二个:

var1      A01     A02     A03
EA-0123   0       0       0
EB-0124   0       0       0
EC-0124   0       0       0
ED-0125   0       0       0

我想计算var1对var2有一定值的次数,得到一个看起来像的输出:

    var1      A01     A02     A03
    EA-0123   1       0       0
    EB-0124   0       0       0
    EC-0124   0       0       2
    ED-0125   1       1       0

第二个数据帧包含的数据并不总是出现在第一个数据帧中,但我希望保留这些行,即使列都指示“0”。

我试图制作一个if elif else循环,但无法使其工作(可能是由于有两个数据帧的事实?),并且找不到像这样的任何其他问题..

1 个答案:

答案 0 :(得分:3)

我认为crosstab需要reindex

from datetime import datetime
from calendar import monthrange
def date_bump_months(start_date, months):
    """
    bumps months back and forth. 
    --> if initial date is end-of-month, i will move to corresponding month-end
    --> ir inital date.day is greater than end of month of final date, it casts it to momth-end
    """
    signbit = -1 if months < 0 else 1
    d_year, d_month = divmod(abs(months),12)    
    end_year = start_date.year + d_year*signbit 
    end_month = 0
    if signbit ==-1:            
        if d_month < start_date.month:
            end_month = start_date.month - d_month
        else:
            end_year -=1
            end_month = 12 - (d_month - start_date.month)
    else:
        end_month +=start_date.month
        if end_month  > 12:
            end_year +=1
            end_month -=12
    # check if we are running end-of-month dates
    eom_run = monthrange(start_date.year, start_date.month)[1]==start_date.day
    eom_month = monthrange((end_year), (end_month))[1]
    if eom_run:
        end_day = eom_month 
    else:
        end_day = min(start_date.day, eom_month )    
    return date(end_year, end_month, end_day)

如果需要更好的效果,请DataFrameGroupBy.size使用unstack

df = pd.crosstab(df1['var1'], df1['var2']).reindex(df2['var1'], fill_value=0)