Python Pandas 从列表创建多个数据框

Python Pandas Create Multiple dataframes from list

以此作为快速起点;

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

使用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

df.groupby('variable') returns 具有 key/df 对的迭代器。因此,要获得 list/dict 个子组,

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

从字面上回答您的问题,globals()['dfA'] = dfNew 将定义 dfA 在全局命名空间中:

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

然而,定义动态命名变量从来都不是一个好的理由。

  • 如果名称直到运行时才知道——也就是说,如果名称是 真实的 动态——那么你不能在你的代码中使用这些名字,因为你的代码有 在运行前编写。那么创建一个名为的变量有什么意义 dfA如果你不能在你的代码中引用它?

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

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

  • 泛化不好。如果你有 100 个动态命名的变量,如何 你会访问它们吗? How would you loop over them?

  • 到 "manage" 动态命名的变量你需要保留它们的列表 名称作为字符串:例如['dfA', 'dfB', 'dfC',...] 然后访问新的 通过 globals() 字典生成全局变量:例如globals()['dfA']。那 很尴尬。

所以程序员通过痛苦的经历得出的结论是 动态命名的变量介于尴尬和无用之间,它是 在字典中存储 key/value 对更加愉快、强大、实用。这 变量的名称成为字典中的键,而变量的值 成为与键关联的值。所以,而不是有一个裸名 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   

或者,

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如果名称已编号或排序,您可以使用列表而不是字典。

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