我有一个带有节点,值和日期时间列的数据框。我想获取每个节点每个月的值从60增长到70所需的最大天数。如果该值保持在60以下或70以上,则该值应仅为0。如果该值未从60变为70或以上,则应为0。
df:
rng = pd.date_range('2019-01-01', periods=365, freq='D')
df= pd.DataFrame({'Date': rng, 'Val': np.random.randint(50, 80, size=365), 'Node': 'A'})
df.set_index('Date', inplace=True)
我已经将索引设置为节点,月份和日期,但是我不知道如何获取阈值之间的值计数。
df.set_index(['Node', df.index.month, df.index])['Val'].between(60, 70)
我认为答案应该是每个月应用两次之间的“ Val”列中的连续True值的最大数量。
输出应该是这样的数据框:
df = pd.DataFrame([
{'Node': 'A', 'Month': 1, 'Count': 3},
{'Node': 'A', 'Month': 2, 'Count': 5},
{'Node': 'A', 'Month': 3, 'Count': 0},
{'Node': 'B', 'Month': 1, 'Count': 5},
{'Node': 'B', 'Month': 2, 'Count': 3},
{'Node': 'B', 'Month': 3, 'Count': 2},
...
])
最佳答案
如果我理解正确,
一种想法是将groupby
与常规cumsum
和cumcount
一起使用来连续计数直到达到70天。
np.random.seed(0)
np.random.randint(50, 80, size=365)
rng = pd.date_range('2019-01-01', periods=365, freq='D')
df= pd.DataFrame({'Date': rng, 'Val': np.random.randint(50, 80, size=365), 'Node': 'A'})
df.sort_values('Date',inplace=True)
df['C'] = (df.loc[(df["Val"] > 60) & (df["Val"] <= 70)]
.groupby([df["Date"].dt.month, (df['Val'] == 70).cumsum()])).cumcount() + 1
因为我们只希望当月的值达到70,所以如果在给定的月份内未达到70,则需要将计数设置为0,因此我们可以按月过滤并将其返回到列表中,然后使用
isin
进行过滤months = df.loc[df['Val'] == 70]['Date'].dt.month.tolist()
df.loc[~df['Date'].dt.month.isin(months),'C'] = 0
df1 = (df.groupby([df['Node'],df['Date'].dt.month])['C'].max()
.reset_index().rename(columns={'Date' : 'Month'}))
print(df1)
Node Month C
0 A 1 0.0
1 A 2 6.0
2 A 3 7.0
3 A 4 11.0
4 A 5 7.0
5 A 6 5.0
6 A 7 6.0
7 A 8 0.0
8 A 9 4.0
9 A 10 0.0
10 A 11 9.0
11 A 12 0.0
关于python - 有没有一种方法可以计算每个月列值从A到B花费的天数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58509369/