【问题标题】:Pandas Dataframe Advanced SplitPandas Dataframe 高级拆分
【发布时间】:2025-12-28 11:10:16
【问题描述】:

我有一个大的 DataFrame,我需要分成两个(A 和 B),A 和 B 中某个列值的行数相同。该列有 700 多个唯一值,它们都是字符串。我举个例子:

DataFrame
  Price  Type
  1      X
  2      Y
  3      Y
  4      X
  5      X
  6      X
  7      Y
  8      Y

当拆分它(随机)时,我应该在 DataFrame A 和 DataFrame B 中得到两个 X 值和两个 Y 值,例如:

A
  Price  Type
  1      X
  5      X
  2      Y
  3      Y

B
  Price  Type
  4      X
  6      X
  7      Y
  8      Y

提前致谢!

【问题讨论】:

  • 类别(XY等)是如何分布的?
  • 不均匀。 1 有 2000 多个值,其他有 4 个。

标签: python python-3.x pandas dataframe


【解决方案1】:

您可以使用groupby().cumcount() 枚举Type 中的行,然后使用%2 将行分为两组:

df['groups'] = df.groupby('Type').cumcount()%2

A,B = df[df['groups']==0], df[df['groups']==1]

输出:

**A**

   Price Type  groups
0      1    X       0
1      2    Y       0
4      5    X       0
6      7    Y       0

**B**

   Price Type  groups
2      3    Y       1
3      4    X       1
5      6    X       1
7      8    Y       1

【讨论】:

  • 感谢您的回复。不幸的是,它为每列中的第一项给出 0,而不是为某个列值的每个项目给出 0。尽管如此,它给了我一个继续下去的想法,而且它确实让事情变得更容易了!
【解决方案2】:

您能否按类型的值进行分组并将 A/B 分配给该组的一半作为新列,然后仅复制分配了标签 A/B 的行?如果您需要精确的拆分,您可以根据组的大小进行拆分

【讨论】:

  • 可能是个好主意,但我不知道如何实现它。
【解决方案3】:

您可以像下面这样使用 numpy 库的“arry_split”功能:

import numpy as np
df_split = np.array_split(df, 2)
df1 = df_split[0]
df2 = df_split[1]

【讨论】:

  • 对不起,不起作用,它将数据帧一分为二,分布不对称
  • 这段代码将一分为二。如果记录总数是偶数,则两个数据帧的分布将相等。如果记录总数是奇数,则第一个 df 将比第二个 df 多一个记录。因为你不能将奇数个df平均分配到两个df中。