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
使用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
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
以此作为快速起点;
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
使用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
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