Python 如何命名for循环中的数据帧?

Python 如何命名for循环中的数据帧?,python,python-3.x,pandas,Python,Python 3.x,Pandas,我试图使用for循环中的变量命名多个数据帧。 以下是我尝试过的: for name in DF['names'].unique(): df_name = name + '_df' df_name = DF.loc[DF['names'] == str(name) 如果DF['names']列中的一个名称是'George',则下面的命令应该用于打印生成的数据帧的开头 George_df.head() 但我收到一条错误消息: TypeError: unsupported oper

我试图使用for循环中的变量命名多个数据帧。 以下是我尝试过的:

for name in DF['names'].unique():
    df_name = name + '_df'
    df_name = DF.loc[DF['names'] == str(name)
如果DF['names']列中的一个名称是'George',则下面的命令应该用于打印生成的数据帧的开头

George_df.head()
但我收到一条错误消息:

TypeError: unsupported operand type(s) for +: 'int' and 'str'
前面的问题讨论了在字典中实现这一点的方法,但我正在寻找一种在数据帧中实现这一点的方法。

设置

df=pd.DataFrame({'names' : ['a','a','b','b'], 'values':list('1234')})

print(df)

  names values
0     a      1
1     a      2
2     b      3
3     b      4

使用
globals


虽然不建议使用
globals
,但我建议您使用字典

dfs = dict(df.groupby('names').__iter__())
print(dfs['a'])

  names values
0     a      1
1     a      2
设置

df=pd.DataFrame({'names' : ['a','a','b','b'], 'values':list('1234')})

print(df)

  names values
0     a      1
1     a      2
2     b      3
3     b      4

使用
globals


虽然不建议使用
globals
,但我建议您使用字典

dfs = dict(df.groupby('names').__iter__())
print(dfs['a'])

  names values
0     a      1
1     a      2

我建议使用这样的字典结构:

test_dict = {}
test_dict["George"] = pd.DataFrame({"A":[1,2,3,4,5]})
就你而言:

test_dict = {}

for name in DF['names'].unique():
    df_name = name + '_df'
    test_dict[df_name] = DF.loc[DF['names'] == str(name)]
但是,如果您需要设置新变量,将解释如何创建它们

for name in DF['names'].unique():
    df_name = name + '_df'
    globals()[df_name] = DF.loc[DF['names'] == str(name)]

我建议使用这样的字典结构:

test_dict = {}
test_dict["George"] = pd.DataFrame({"A":[1,2,3,4,5]})
就你而言:

test_dict = {}

for name in DF['names'].unique():
    df_name = name + '_df'
    test_dict[df_name] = DF.loc[DF['names'] == str(name)]
但是,如果您需要设置新变量,将解释如何创建它们

for name in DF['names'].unique():
    df_name = name + '_df'
    globals()[df_name] = DF.loc[DF['names'] == str(name)]


这回答了你的问题吗。。。最常见的解决方案可能是将对象保存在字典中。当发布有关产生异常的代码的问题时,始终包括完整的回溯-复制并粘贴它,然后将其格式化为代码(选择它并键入
ctrl-k
)这是否回答了您的问题。。。可能最常见的解决方案是将对象保存在字典中。当发布有关产生异常的代码的问题时,始终包括完整的回溯-复制并粘贴它,然后将其格式化为代码(选择它并键入
ctrl-k
),我们不应该使用Series.unique+boolean索引,这很慢。我们应该使用groupbyhere@ansev我同意。我试图将其与他的代码相似,但您的代码肯定更有效。我们不应该使用Series.unique+boolean索引,这太慢了。我们应该使用groupbyhere@ansev我同意。我试着将其与他的代码相似,但你的代码肯定更有效。次要语义-措辞听起来像是你在推荐使用
globals
而不是
dict
。我很确定情况并非如此,因为我觉得你听起来并不疯狂。@ansev谢谢你的解释!我可以使用相同的命令在每个字典中执行操作吗?比如:df_{name}['Num']=np.arange(1521)@r.ook为什么使用globals是疯狂的?使用
globals
scope通常是不受欢迎的,因为它会弄乱您的名称空间,使您的代码越复杂,就越难处理。如果您可以只使用一个
dict
来管理所有变量名,而不是全局范围内的100个名称,那么您的生活就会轻松得多。我建议使用字典,我不鼓励使用globals,我想我在我的回答中解释错了:)@r.ookMinor semantics-这句话听起来像是你建议使用
globals
而不是
dict
。我很确定情况并非如此,因为我觉得你听起来并不疯狂。@ansev谢谢你的解释!我可以使用相同的命令在每个字典中执行操作吗?比如:df_{name}['Num']=np.arange(1521)@r.ook为什么使用globals是疯狂的?使用
globals
scope通常是不受欢迎的,因为它会弄乱您的名称空间,使您的代码越复杂,就越难处理。如果您可以只使用一个
dict
来管理所有变量名,而不是全局范围内的100个名称,那么您的生活就会轻松得多。我建议使用字典,我不鼓励使用globals,我想我在回答中解释错了:)@r.ook