【发布时间】:2021-04-23 14:52:55
【问题描述】:
我想将此 DataFrame 拆分为预定义数量的 大致相同大小的块:
import pandas as pd
df = pd.DataFrame({
"user": ["A", "A", "B", "C", "C", "C"],
"value": [0.3, 0.4, 0.5, 0.6, 0.7, 0.8]})
# user value
# 0 A 0.3
# 1 A 0.4
# 2 B 0.5
# 3 C 0.6
# 4 C 0.7
# 5 C 0.8
DataFrame 很大(数百万行),因此代码应该或多或少有效率。 问题是某些用户应该只出现在其中一个块中。
例如如果块数为 3 则:
- 第一个块应该有行 [0, 1]
- 第二个块应该有第 2 行,没有第 3 行,因为第 3 行是给用户 C 的
- 第三个块应该有行 [3, 4, 5]
# Chunk #1 (DataFrame):
# 0 A 0.3
# 1 A 0.4
# Chunk #2 (DataFrame):
# 2 B 0.5
# Chunk #3 (DataFrame):
# 3 C 0.6
# 4 C 0.7
# 5 C 0.8
由于用户 C 将出现在 2 个块中,因此这种分成 3 块的分块是不正确的:
# Chunk #1 (DataFrame):
# 0 A 0.3
# 1 A 0.4
# Chunk #2 (DataFrame):
# 2 B 0.5
# 3 C 0.6
# Chunk #3 (DataFrame):
# 4 C 0.7
# 5 C 0.8
我认为,当我们首先按用户执行 groupby 然后将该 DataFrameGroupBy 对象拆分为块时,一些解决方案就足够了。
【问题讨论】:
-
你能添加你理想的输出吗?它应该是由用户拆分的数据框列表吗?
-
当 n=2 时会发生什么?
-
@sophocles,感谢您的评论!它应该是一个大小大致相同的 DataFrame 列表,但一个用户应该只在一个结果 DataFrame 中。
-
@anky,这个很灵活,两种情况 [[0,1,2], [3, 4, 5]] 和 [[0,1], [2, 3, 4 , 5]] 就足够了。但当然有些用户会有 2 个价值和数百个。
-
您需要保留订单吗?例如您可以使用
groupby("user")分组,然后将组合并在一起以达到所需的最终块数。这样您就可以结束将原始数据框中不接近的用户分组在一起,这样可以吗?