python-3.x - 基于多列值拆分数据框
问题描述
我有一个 1M+ 行的数据框。数据框示例如下所示:
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。
所以新的数据框应该是:
- df1(具有类型=电话和文件=1的数据)
- df2(具有类型=计算机和文件=1的数据)
- df3(具有类型=电话和文件=2的数据)
- 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 个数据帧?
注意:我知道我可以先拆分“类型”,然后根据“文件”拆分结果数据帧以获得输出。但是,我想知道一种更有效的方法来执行拆分,而不必创建多个数据框来完成工作。
编辑
这不是一个重复的问题,因为我想根据多个列值拆分数据框,而不仅仅是一个!
解决方案
您可以使用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
and File==1
,依此类推。
推荐阅读
- amazon-web-services - 通过 ssh 将存储分配到 AWS 上的特定文件夹
- python - 带有结束选项的 Python 打印有时会延迟打印
- amazon-web-services - Amazon lex 根据前一个插槽的解析值跳过一个插槽
- python - python:希望从今天收到的 Outlook 邮件中保存附件并带有特定主题
- java - 代码没有错误。但是在启动应用程序时说,不幸的是应用程序已停止
- amp-html - AMP:将 setState 设置为初始值
- python-3.x - ModuleNotFoundError:没有名为“numpy.random._pickle”的模块
- java - `PriorityQueue` 中的 `add` 和 `addAll` 行为不同,这是为什么呢?
- reactjs - 如何在两个页面之间传输数据反应原生导航
- acumatica - 如何订阅 Acumatica 中的用户定义字段