我需要计算各行之间的行date_from和date_to,例如:
我有这个DataFrame: date_from date_to
0 2017-07-01 2017-07-03
1 2017-07-01 2017-07-05
2 2017-07-02 2017-07-04
3 2017-07-03 2017-07-04
我需要计算列date_from和date_to之间的行数,例如:
count
date
2017-07-01 2
2017-07-02 3
2017-07-03 3
2017-07-04 1
我尝试过:
df.groupby(['date_from','date_to']).size()
但是熊猫计算一次
修改
我需要计算两个日期之间有多少行, 只有一行的数据框:
date_from date_to
0 2017-07-01 2017-07-03
有这个输出: 2017-07-01 1 2017-07-02 1
答案 0 :(得分:1)
我认为你需要:
date_to
stack
并按set_index
DatetimeIndex
{li> groupby
和resample
day
s并按ffill
或count
汇总
groupby
+ size
或value_counts
df['date_to'] = df['date_to'] - pd.to_timedelta(1, unit='d')
df = df.stack().rename_axis(('a','b')).reset_index(name='c').set_index('c')
df = df.groupby('a').resample('d').ffill().groupby('c').size().reset_index(name='a')
print (df)
c a
0 2017-07-01 2
1 2017-07-02 3
2 2017-07-03 3
3 2017-07-04 1
类似的解决方案:
df['date_to'] = df['date_to'] - pd.to_timedelta(1, unit='d')
df = df.stack().rename_axis(('a','b')).reset_index(name='c').set_index('c')
df = df.groupby('a').resample('d')['b'].size().reset_index()
#
df = df['c'].value_counts().sort_index().rename_axis('a').reset_index()
print (df)
a c
0 2017-07-01 2
1 2017-07-02 3
2 2017-07-03 3
3 2017-07-04 1
另一个itertuples
的解决方案:
df['date_to'] = df['date_to'] - pd.to_timedelta(1, unit='d')
df=pd.concat([pd.Series(r.Index,
pd.date_range(r.date_from, r.date_to)) for r in df.itertuples()])
.reset_index()
df = df['index'].value_counts().sort_index().rename_axis('a').reset_index(name='c')
print (df)
a c
0 2017-07-01 2
1 2017-07-02 3
2 2017-07-03 3
3 2017-07-04 1