【问题标题】:How to create multiple dataframes with no repetition from one dataframe?如何创建多个数据帧而不从一个数据帧重复?
【发布时间】:2019-10-18 09:56:36
【问题描述】:

我有一个如下所示的数据框

df = pd.DataFrame({
'subject_id':[1,1,1,1,2,2,2,2,3,3,4,4,4,4,4],
'readings' : ['READ_1','READ_2','READ_1','READ_3','READ_1','READ_5','READ_6','READ_8','READ_10','READ_12','READ_11','READ_14','READ_09','READ_08','READ_07'],
 'val' :[5,6,7,11,5,7,16,12,13,56,32,13,45,43,46],
 })

我想做的是从中创建多个数据帧 (df1,df2)。在实时它不必是两个。根据我的数据大小,它可以是 10 或 20。 我问这个是因为我打算做并行处理。我会将一个巨大的 df 划分为多个小的数据帧并进行并行处理

例如df1 应包含 2(两个)科目的所有记录,df2 应包含其余 2 个科目的所有记录

试过了,但是不对

grouped = df.groupby('subject_id')
df1 = grouped.filter(lambda x: x['subject_id']== 2)

我希望我的输出是这样的

df1 - 包含 2 个主题的所有记录。我希望实时选择 100 个主题,并希望将他们的所有记录放在一个数据框中

df2 - 包含 2 个主题的所有记录。但在实时,我希望选择 100 个主题并将他们的所有记录放在一个数据框中

如您所见,基于主题的数据有明确的隔离,并且在多个数据框中不存在主题的数据。赞subject_id = 1 has data only in df1

更新帖子

【问题讨论】:

  • 以下两个答案都很好,并提供了预期的输出。我不知道哪个最好。我只能标记一个并选择 Jezrael 的答案,因为它有更多的支持。尽管如此,两个答案都被赞成

标签: python python-3.x pandas dataframe pandas-groupby


【解决方案1】:

使用 groupby

创建 DataFrame 列表

如果subject_id 是从1N 的数字:

dfs = [x for _,x in df.groupby((df['subject_id'] - 1) // N)]

使用subject_id 中的任何值的通用解决方案 - 例如字符串:

使用factorize 表示数组整数除以subject_id 的数量:

N = 2

print (pd.factorize(df['subject_id'])[0])
[0 0 0 0 1 1 1 1 2 2 3 3 3 3 3]

print (pd.factorize(df['subject_id'])[0] // N )
[0 0 0 0 0 0 0 0 1 1 1 1 1 1 1]
dfs = [x for _,x in df.groupby(pd.factorize(df['subject_id'])[0] // N)]
print (dfs)
[   subject_id readings  val
0           1   READ_1    5
1           1   READ_2    6
2           1   READ_1    7
3           1   READ_3   11
4           2   READ_1    5
5           2   READ_5    7
6           2   READ_6   16
7           2   READ_8   12,     subject_id readings  val
8            3  READ_10   13
9            3  READ_12   56
10           4  READ_11   32
11           4  READ_14   13
12           4  READ_09   45
13           4  READ_08   43
14           4  READ_07   46]

print (dfs[0])
   subject_id readings  val
0           1   READ_1    5
1           1   READ_2    6
2           1   READ_1    7
3           1   READ_3   11
4           2   READ_1    5
5           2   READ_5    7
6           2   READ_6   16
7           2   READ_8   12

【讨论】:

  • factorize 是干什么用的?为什么不[chunk for _, chunk in df.groupby((df['subject_id']-1) // 2)]
  • @Dan - 刚刚添加
  • 我能知道divide by N 在这里是如何工作的吗? pd.factorize(df['subject_id'])[0] // N ?
  • @SSMK - 你能检查一下this 吗?
  • 谢谢。 x for _,x 中的下划线意味着什么?
【解决方案2】:

我觉得你需要pd.cut 来组团:

n=2
groups=pd.cut(df['subject_id'],n)
for i , group in df.groupby(groups):
    print(group)

   subject_id readings  val
0           1   READ_1    5
1           1   READ_2    6
2           1   READ_1    7
3           1   READ_3   11
4           2   READ_1    5
5           2   READ_5    7
6           2   READ_6   16
7           2   READ_8   12
    subject_id readings  val
8            3  READ_10   13
9            3  READ_12   56
10           4  READ_11   32
11           4  READ_14   13
12           4  READ_09   45
13           4  READ_08   43
14           4  READ_07   46

如果你愿意,你可以保存在一个列表中:

#savig in a list
df_list=[group for i , group in df.groupby(groups)]

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多