在python中创建循环中的新数据帧

在python中创建循环中的新数据帧,python,pandas,for-loop,dataframe,Python,Pandas,For Loop,Dataframe,我一直在从事一个项目,我陷入了这样一种情况:我需要从一个字符串列表中创建多个数据帧,方法是从另一个数据帧中筛选字符串列表的值,该数据帧的列包含列表中相同的值。我正在编写以下代码: df = pd.DataFrame({'A': range(1, 5), 'B': np.random.randn(4), 'C':['A',A','B','C']} list = df.C.unique() list = list.tolist() for r in list: exec('df_{}=df[df.C

我一直在从事一个项目,我陷入了这样一种情况:我需要从一个字符串列表中创建多个数据帧,方法是从另一个数据帧中筛选字符串列表的值,该数据帧的列包含列表中相同的值。我正在编写以下代码:

df = pd.DataFrame({'A': range(1, 5), 'B': np.random.randn(4), 'C':['A',A','B','C']}
list = df.C.unique()
list = list.tolist()
for r in list:
exec('df_{}=df[df.C=={}]'.format(r))

这引发了一个错误,称为“元组索引超出范围”。有人能帮我一下吗?

我建议使用
dict
,因为它比
exec
更安全:

uniqueC = df.C.unique()

dfs = {'df_{}'.format(r): df[df.C==r] for r in uniqueC}
现在,当您需要某个数据帧时,只需调用:

dfs['df_A']
#   A         B  C
#0  1  1.755507  A
#1  2 -0.371027  A

使用字典查找可变数量的变量。您可以在词典理解中使用
groupby

dfs = {k: v for k, v in df.groupby('C')}

print(dfs['B'])

   A         B  C
2  3 -0.785257  B
我建议你不要这样做:

  • 在内置后命名变量,例如,不要将
    list
    用作变量名
  • 由于安全缺陷,请使用
    exec
  • 忘记为循环缩进任何
    。缩进在Python中很重要
  • 您可以将对象转换为
    tuple
    s,然后再转换为
    dict
    s:

    d = dict(tuple(df.groupby('C')))
    


    我的最佳猜测是您打算编写
    .format(r,r)
    ,但这仍然会引发错误。您必须更详细地了解代码的预期输出。@lit-答案已更改。非常感谢。对我有用。谢谢你的提示!:)
    d = dict(tuple(df.groupby('C')))
    print (d['A'])
       A         B  C
    0  1  0.670449  A
    1  2 -1.265135  A
    
    print (d['B'])
       A        B  C
    2  3 -0.35891  B
    
    print (d['C'])
       A         B  C
    3  4  0.651704  C