借助循环(python)拆分数据框

Posted

技术标签:

【中文标题】借助循环(python)拆分数据框【英文标题】:Splitting a dataframe with the help of a loop (python) 【发布时间】:2021-10-13 00:48:27 【问题描述】:

我需要帮助。我想通过一个DF。部分我的用户有 2 个团队(在行中用逗号分隔)。我用逗号将它们分开,并将它们写在新列 Team_1 和 Team_2 中。 如果只有一个团队,则团队名称进入团队 1。

import numpy as np
import pandas as pd
df = pd.DataFrame(
    'name': [
        'abby',
        'bella',
        'coco',
        'deedee',
        'elliot'],
    'email': [
        'a@test.com',
        'b@test.com',
        'c@test.com',
        'd@test.com',
        'e@test.com'],
    'team(s)': [
        'alpha',
        'omega',
        'alpha,omega',
        'beta',
        'beta,omega'
    ])

df_split_teams = df.join(df['team(s)'].str.split(',', 1, expand=True)).rename(columns=0: 'Team_1', 1:'Team_2')
if 'None' in df.index:
    df_split_teams['Team_1'] == df_split_teams['team(s)']

我可以使用一个函数来显示可用的各个团队名称:

def get_team_names(df):
    team_names = set(df['team(s)'])
    split_team_names = set()
    for team in team_names:
        for name in team.split(','):
            split_team_names.add(name)
    return split_team_names

但是:现在我想为所有团队设置一个单独的 DF。每队一名 DF。最好的自动化循环。首先我是这样做的:

df_alpha = df_split_teams[(df_split_teams['Team_1'].isin(['alpha'])) | (df_split_teams['Team_2'].isin(['alpha']))]
df_beta = df_split_teams[(df_split_teams['Team_1'].isin(['beta'])) | (df_split_teams['Team_2'].isin(['beta']))]
df_omega = df_split_teams[(df_split_teams['Team_1'].isin(['omega'])) | (df_split_teams['Team_2'].isin(['omega']))]

但不时会添加新团队,或者我们有不同的团队。代码通常应该是有效的。也适用于我同事的其他人。因此,我无法在我的代码中预定义团队名称。

希望您能提供帮助。 问候 贝基里

【问题讨论】:

【参考方案1】:

您非常接近解决方案。

您只需要使用globals() 方法遍历您的函数get_team_names()

globals() 方法返回当前全局符号表的字典。 (符号表是由编译器维护的数据结构)

for i in get_team_names(df):
    globals()['df_' + str(i)] = df_split_teams[(df_split_teams['Team_1'].isin([i])) | (df_split_teams['Team_2'].isin([i]))]

输出:

df_alpha
Out[29]: 
   name       email      team(s) Team_1 Team_2
0  abby  a@test.com        alpha  alpha   None
2  coco  c@test.com  alpha,omega  alpha  omega

df_beta
Out[30]: 
     name       email     team(s) Team_1 Team_2
3  deedee  d@test.com        beta   beta   None
4  elliot  e@test.com  beta,omega   beta  omega

df_omega
Out[31]: 
     name       email      team(s) Team_1 Team_2
1   bella  b@test.com        omega  omega   None
2    coco  c@test.com  alpha,omega  alpha  omega
4  elliot  e@test.com   beta,omega   beta  omega

【讨论】:

非常感谢!!!!但是现在我有另一个问题:(在我的源代码中,团队名称中有空格。'df_' + str(i) 不能很好地转换。我可以直接把空格去掉吗?或者我应该先把它清理掉? 用下划线替换空格.... globals()['df_' + str(i.replace(" ", "_"))] = .......... ....

以上是关于借助循环(python)拆分数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Databricks 中使用 Python 将数据框数组拆分为列

基于行索引拆分数据框

Python Pandas:如何在数据框的列中拆分已排序的字典

Python、Pandas:80/20 随机拆分数据;当索引值“丢失”时如何循环?

根据列值拆分 Python 数据框,然后在算法中使用它们

Python,Pandas,数据框 - 拆分和删除单元格的某些部分