【问题标题】:Splitting dataframe based on multiple column values基于多列值拆分数据框
【发布时间】:2019-09-11 03:23:05
【问题描述】:

我有一个超过 100 万行的数据框。数据框示例如下所示:

df

    ID      Type        File    
 0  123     Phone       1       
 1  122     Computer    2       
 2  126     Computer    1       

我想根据类型和文件拆分这个数据框。如果 Type 的总数为 2(电话和计算机),文件总数为 2(1,2),则拆分总数为 4。

简而言之,总拆分如下:

 total_splits=len(set(df['Type']))*len(set(df['File']))

在本例中,total_splits=4。现在,我想根据类型和文件将数据帧 df 拆分为 4。

所以新的数据框应该是:

  1. df1(数据类型=Phone 和 File=1)
  2. df2(数据类型=计算机,文件=1)
  3. df3(数据类型=Phone 和 File=2)
  4. df4(数据类型=计算机和文件=2)

拆分应该在循环内完成。

我知道我们可以根据一个条件拆分数据帧(如下所示),但是如何根据两个条件拆分它?

我的代码:

data = {'ID' : ['123', '122', '126'],'Type' :['Phone','Computer','Computer'],'File' : [1,2,1]}

df=pd.DataFrame(data) 

types=list(set(df['Type']))
total_splits=len(set(df['Type']))*len(set(df['File']))

cnt=1

for i in range(0,total_splits):
      for j in types:
            locals()["df"+str(cnt)] = df[df['Type'] == j]
            cnt += 1

上述代码的结果给出了 2 个数据帧,df1 和 df2。 df1 将具有 Type='Phone' 的数据,而 df2 将具有 Type='Computer' 的数据。

但这只是我想做的一半。有没有办法我们可以根据 2 个条件在这里制作 4 个数据帧?

注意:我知道我可以先拆分“类型”,然后根据“文件”拆分生成的数据框以获得输出。但是,我想知道一种更有效的方法来执行拆分,而不必创建多个数据框来完成工作。

编辑

这不是一个重复的问题,因为我想根据多个列值拆分数据框,而不仅仅是一个!

【问题讨论】:

标签: python-3.x pandas


【解决方案1】:

你可以用groupby:

dfs = {}
for k, d in df.groupby(['Type','File']):
    type, file = k

    # do want ever you want here
    # d is the dataframe corresponding with type, file
    dfs[k] = d

你也可以创建一个面具:

df['mask'] = df['File'].eq(1) * 2 + df['Type'].eq('Phone')

那么,例如:

df[df['mask'].eq(0)]

为您提供所需的第一个数据帧,即Type==Phone 和File==1,依此类推。

【讨论】:

  • 我使用了 groupby 方法,但最终得到了 8 个数据帧,并生成了很多重复的数据帧。我使用的代码是:cnt=1 for k, d in df.groupby(['File','Type']): type, file = k locals()["df"+str(cnt)] = d cnt += 1
  • 这意味着您有更多类别,例如 3 种类型。您可能想先过滤掉它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 2019-11-18
  • 1970-01-01
  • 2016-11-13
  • 2023-01-12
  • 1970-01-01
相关资源
最近更新 更多