【问题标题】:Creating new dataframes in loop in python在python中循环创建新的数据框
【发布时间】:2018-05-23 10:24:43
【问题描述】:

我一直在从事一个项目,我陷入了这样一种情况,即我需要通过过滤来自另一个数据帧的字符串列表的值来从字符串列表创建多个数据帧,该数据帧的列包含相同的值名单。我正在编写如下代码:

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))

这一直在抛出一个错误,说“元组索引超出范围”。有人可以快速帮忙吗?

【问题讨论】:

  • 我最好的猜测是你打算写.format(r, r),但这仍然会引发错误。您必须更详细地了解代码的预期输出。

标签: python pandas for-loop dataframe


【解决方案1】:

您可以将groupby 对象转换为tuples,然后再转换为dicts:

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

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

【讨论】:

  • @lit - 答案已更改。
  • 非常感谢。为我工作。
【解决方案2】:

我建议使用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

【讨论】:

    【解决方案3】:

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

    dfs = {k: v for k, v in df.groupby('C')}
    
    print(dfs['B'])
    
       A         B  C
    2  3 -0.785257  B
    

    我建议你不要

    1. 在内置函数后命名变量,例如不要使用list 作为变量名。
    2. 由于安全缺陷,请使用exec
    3. 忘记缩进任何for 循环。缩进在 Python 中很重要。

    【讨论】:

    • 感谢您的提示! :)
    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多