【问题标题】:Pandas DataFrame: resampling along integer index / grouping by groups of n elementsPandas DataFrame:沿整数索引重新采样/按 n 个元素组分组
【发布时间】:2018-04-22 03:52:24
【问题描述】:

我知道 pandas resampling 使用 DateTimeIndex 的函数。

但我怎样才能轻松地沿整数索引重新采样/分组?

以下代码说明了问题和工作原理:

import numpy as np
import pandas as pd


df = pd.DataFrame(np.random.randint(5, size=(10, 2)), columns=list('AB'))
print(df)

   A  B
0  3  2
1  1  1
2  0  1
3  2  3
4  2  0
5  4  0
6  3  1
7  3  4
8  0  2
9  4  4

# sum of n consecutive elements
n = 3
tuples = [(i, i+n-1) for i in range(0, len(df.index), n)]
df_new = pd.concat([df.loc[i[0]:i[1]].sum() for i in tuples], 1).T
print(df_new)

   A  B
0  4  4
1  8  3
2  6  7
3  4  4

但是没有更优雅的方式来实现这一点吗?

代码对我来说似乎有点笨拙..

提前致谢!

【问题讨论】:

  • stackoverflow.com/questions/37396264/… 检查这是否解决了您的问题。我认为它确实 - 现在无法测试 - 但你需要在之后重置你的索引。 :)
  • 我认为我自己的方法已经更容易了 ;-)。还是谢谢!

标签: python pandas


【解决方案1】:

您可以对索引进行下限和聚合一些功能:

df1 = df.groupby(df.index // n).sum()

如果索引不是默认的(整数、唯一)聚合按楼层除以numpy.arange 由len 创建的DataFrame:

df1 = df.groupby(np.arange(len(df)) // n).sum()

【讨论】:

  • 谢谢你们!
【解决方案2】:

您可以对索引除以 n 的整数除法使用 group by。即

df.groupby(lambda i: i//n).sum()

这里是代码

import numpy as np
import pandas as pd

n=3
df = pd.DataFrame(np.random.randint(5, size=(10, 2)), columns=list('AB'))

print('df:')
print(df)
res = df.groupby(lambda i: i//n).sum()
print('using groupby:')
print(res)

tuples = [(i, i+n-1) for i in range(0, len(df.index), n)]
df_new = pd.concat([df.loc[i[0]:i[1]].sum() for i in tuples], 1).T
print('using your method:')
print(df_new)

和输出

df:
   A  B
0  1  0
1  3  0
2  1  1
3  0  4
4  3  4
5  0  1
6  0  4
7  4  0
8  0  2
9  2  2
using groupby:
   A  B
0  5  1
1  3  9
2  4  6
3  2  2
using you method:
   A  B
0  5  1
1  3  9
2  4  6
3  2  2

【讨论】:

  • 谢谢你们!
猜你喜欢
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 2016-09-20
  • 1970-01-01
相关资源
最近更新 更多