我对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循环,但无法使其工作(可能是由于有两个数据帧的事实?),并且找不到像这样的任何其他问题..
答案 0 :(得分:3)
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)