Python Pandas从列表中创建多个数据帧

时间:2015-08-10 19:12:04

标签: python pandas ipython

将此作为快速起点;

http://pandas.pydata.org/pandas-docs/stable/reshaping.html

In [1]: df
Out[1]: 
         date variable     value
0  2000-01-03        A  0.469112
1  2000-01-04        A -0.282863
2  2000-01-05        A -1.509059
3  2000-01-03        B -1.135632
4  2000-01-04        B  1.212112
5  2000-01-05        B -0.173215
6  2000-01-03        C  0.119209
7  2000-01-04        C -1.044236
8  2000-01-05        C -0.861849
9  2000-01-03        D -2.104569
10 2000-01-04        D -0.494929
11 2000-01-05        D  1.071804

然后隔离'A'给出了这个:

In [2]: df[df['variable'] == 'A']
Out[2]: 
        date variable     value
0 2000-01-03        A  0.469112
1 2000-01-04        A -0.282863
2 2000-01-05        A -1.509059

现在创建新的数据框将是:

dfA = df[df['variable'] == 'A'] 

让我们说B会是:

dfB = df[df['variable'] == 'B'] 

因此,将数据帧隔离为dfA,dfB,dfC ......

dfList  = list(set(df['variable']))
dfNames = ["df" + row for row in dfList]  

for i, row in enumerate(dfList):
    dfName = dfNames[i]
    dfNew = df[df['variable'] == row]
    dfNames[i] = dfNew      

它会运行......但是当我尝试dfA时,我会得到输出"dfA" is not defined

4 个答案:

答案 0 :(得分:5)

使用groupbyget_group,例如:

grouped = df.groupby('variable')

然后,当您想对每个组执行某些操作时,请按以下方式访问它:

my_group = grouped.get_group('A')

给你:

    date    variable    value
0   2000-01-03  A   0.469112
1   2000-01-04  A   -0.282863
2   2000-01-05  A   -1.509059

答案 1 :(得分:3)

要按字面意思回答您的问题,globals()['dfA'] = dfNew会定义dfA 在全局命名空间中:

for i, row in enumerate(dfList):
    dfName = dfNames[i]
    dfNew = df[df['variable'] == row]
    globals()[dfName] = dfNew   

但是,定义动态命名变量永远不是一个好理由。

  • 如果直到运行时才知道名称 - 也就是说,如果名称​​真正 动态 - 然后你就不能在你的代码中使用代码中的名字了 在运行时之前编写。那么创建一个名为的变量有什么意义呢 dfA如果您不能在代码中引用它?

  • 另一方面,如果您事先知道您将拥有一个变量 命名为dfA,那么你的代码就不是真正的动态。你有静态变量名称。 使用循环的唯一原因是减少锅炉板代码。然而, 即使在这种情况下,也有更好的选择。 解决方案是使用dict(见下文)或列出 1

  • 添加动态命名的变量会污染全局命名空间。

  • 它没有很好地概括。如果您有100个动态命名变量,那么如何 你会访问它们吗? How would you loop over them?

  • 要“管理”动态命名的变量,您需要保留其列表 名字作为字符串:例如['dfA', 'dfB', 'dfC',...]然后访问新的 通过globals() dict创建全局变量:例如globals()['dfA']。那 很尴尬。

因此,程序员通过痛苦经历得出的结论是 动态命名的变量介于尴尬和无用之间,它就是 在字典中存储键/值对更加愉快,强大,实用。该 变量的名称成为dict中的键,以及变量的值 成为与密钥关联的值。所以,而不是一个简单的名字dfA 你会有一个词典dfs,你可以访问dfA DataFrame dfs['dfA']

dfs = dict()
for i, row in enumerate(dfList):
    dfName = dfNames[i]
    dfNew = df[df['variable'] == row]
    dfs[dfName] = dfNew   

或,Jianxun Li shows

dfs = {k: g for k, g in df.groupby('variable')}

这就是为什么Jon Clements和Jianxun Li通过展示回答你的问题 定义动态命名变量的替代方法。这是因为我们所有人 相信这是一个糟糕的主意。

使用Jianxun Li的解决方案,循环遍历a dict's key/value pairs,然后您可以使用:

dfs = {k: g for k, g in df.groupby('variable')}
for key, df in dfs.items():
    ...

或使用Jon Clements的解决方案,您可以使用iterate through groups

grouped = df.groupby('variable')
for key, df in grouped:
    ...

1 如果名称已编号或已订购,您可以使用列表而不是字典。

答案 2 :(得分:1)

df.groupby('variable')返回一对key/df对的迭代器。所以要获得子组的列表/字典,

result = {k: g for k, g in df.groupby('variable')}

from pprint import pprint
pprint(result)

{'A':          date variable   value
0  2000-01-03        A  0.4691
1  2000-01-04        A -0.2829
2  2000-01-05        A -1.5091,
 'B':          date variable   value
3  2000-01-03        B -1.1356
4  2000-01-04        B  1.2121
5  2000-01-05        B -0.1732,
 'C':          date variable   value
6  2000-01-03        C  0.1192
7  2000-01-04        C -1.0442
8  2000-01-05        C -0.8618,
 'D':           date variable   value
9   2000-01-03        D -2.1046
10  2000-01-04        D -0.4949
11  2000-01-05        D  1.0718}


result['A']

         date variable   value
0  2000-01-03        A  0.4691
1  2000-01-04        A -0.2829
2  2000-01-05        A -1.5091

答案 3 :(得分:0)

for i, row in enumerate(dfList):
    dfName = dfNames[i]
    dfNew = df[df['variable'] == row]
    vars()[dfNames[i]] = dfNew