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

时间:2018-05-23 10:24:44

标签: 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=={}]'.format(r))

这引发了一个错误,指出'元组索引超出范围'。有人可以快点帮忙吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

使用字典表示可变数量的变量。您可以在词典理解中使用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中很重要。

答案 2 :(得分:0)

您可以将groupby对象转换为tuple s,然后转换为dict s:

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