将此作为快速起点;
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
答案 0 :(得分:5)
使用groupby
和get_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
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