gpt4 book ai didi

python - 如何计算多索引数据框中每天的行数?

转载 作者:行者123 更新时间:2023-11-30 22:32:23 25 4
gpt4 key购买 nike

我有一个带有两级多重索引的 DataFrame。第一级date是一个DatetimeIndex,第二级name只是一些字符串。数据间隔为 10 分钟。

如何在此 MultiIndex 的第一级上按日期进行分组并计算每天的行数?

我怀疑将 DatetimeIndex 耦合到 MultiIndex 会给我带来问题,因为这样做

data.groupby(pd.TimeGrouper(freq='D')).count()

给我

TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'MultiIndex'

我也尝试过写作

data.groupby(data.index.levels[0].date).count()

这会导致

ValueError: Grouper and axis must be same length

例如,我怎样才能使石斑鱼更长(即包含重复的索引值,省略现在使其比轴短)?

谢谢!

最佳答案

您可以在Grouper中使用level关键字。 (另请注意,TimeGrouper 已弃用)。这个参数是

the level for the target index.

示例数据框:

dates = pd.date_range('2017-01', freq='10MIN', periods=1000)
strs = ['aa'] * 1000
df = pd.DataFrame(np.random.rand(1000,2), index=pd.MultiIndex.from_arrays((dates, strs)))

解决方案:

print(df.groupby(pd.Grouper(freq='D', level=0)).count())
0 1
2017-01-01 144 144
2017-01-02 144 144
2017-01-03 144 144
2017-01-04 144 144
2017-01-05 144 144
2017-01-06 144 144
2017-01-07 136 136

更新:您在评论中指出,您的结果计数中有您想要删除的零。例如,假设您的 DataFrame 实际上丢失了几天:

df = df.drop(df.index[140:400])
print(df.groupby(pd.Grouper(freq='D', level=0)).count())
0 1
2017-01-01 140 140
2017-01-02 0 0
2017-01-03 32 32
2017-01-04 144 144
2017-01-05 144 144
2017-01-06 144 144
2017-01-07 136 136

据我所知,无法排除 .count 中的零计数。相反,您可以使用上面的结果来去掉零。

第一个解决方案(可能不太好,因为当引入 np.nan 时,它会将 int 结果转换为 float,将是

res = df.groupby(pd.Grouper(freq='D', level=0)).count()
res = res.replace(0, np.nan).dropna()

我认为,第二个也是更好的解决方案来自 here :

res = res[(res.T != 0).any()]
print(res) # notice - excludes 2017-01-02
0 1
2017-01-01 140 140
2017-01-03 32 32
2017-01-04 144 144
2017-01-05 144 144
2017-01-06 144 144
2017-01-07 136 136

.any 来自 NumPy,移植到 pandas,当任何元素在请求的轴上为 True 时返回 True。

关于python - 如何计算多索引数据框中每天的行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45488803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com