Python 从原始数据框创建新数据框,并在列中使用唯一值命名

Python 从原始数据框创建新数据框,并在列中使用唯一值命名,python,pandas,Python,Pandas,我想创建几个pandas数据框,其名称在原始pandas数据框的列中是唯一的值。例如:给定原始数据帧,如图所示: 我想从这个原始数据帧为每个股票代码创建新的数据帧。我有: In: df.Ticker.unique() Out: array(['AAPL', 'AXP', 'BA', 'CAT', 'CSCO', 'CVX', 'DIS', 'DOW', 'GS', 'HD', 'IBM', 'INTC', 'JNJ', 'JPM', 'KO', 'MCD', 'MRK', 'MSFT'

我想创建几个pandas数据框,其名称在原始pandas数据框的列中是唯一的值。例如:给定原始数据帧,如图所示:

我想从这个原始数据帧为每个股票代码创建新的数据帧。我有:

In: df.Ticker.unique()

Out: array(['AAPL', 'AXP', 'BA', 'CAT', 'CSCO', 'CVX', 'DIS', 'DOW', 'GS',
   'HD', 'IBM', 'INTC', 'JNJ', 'JPM', 'KO', 'MCD', 'MRK', 'MSFT',
   'NKE', 'PFE', 'PG', 'TRV', 'UNH', 'UTX', 'V', 'VZ', 'WBA', 'WMT',
   'XOM', 'MMM'], dtype=object)
我可以通过以下方式手动完成:

df_APPL = df.loc[df['Ticker'] == 'AAPL']
df_AXP = df.loc[df['Ticker'] == 'AXP']
...
df_MMM = df.loc[df['Ticker'] == 'MMM']

我想知道是否有比这个更快的方法。

您可以遍历ticker并将每个数据帧保存在字典中,以ticker名称作为键:

dataframes = dict()
for t in df["Ticker"].unique():
    dataframes[t] = df.loc[df['Ticker'] == t]
这个循环可以简化为字典理解:

dataframes = {t: df.loc[df['Ticker'] == t] for t in df["Ticker"].unique()}
更新: 或者,如果您想将数据框创建为命名变量(即,有一个名为
df_AAPL
的数据框,包含所有AAPL行),每个ticker有一个数据框,您可以使用
exec
函数:

for t in df["Ticker"].unique():
    exec(f"df_{t} = df.loc[df['Ticker'] == t]")
请注意,在调试程序时,这可能会造成困难,因为您将以编程方式创建变量,而这些变量在代码中的任何地方都没有显式声明。这还假定
Ticker
列中的每个值不包含任何无效Python标识符的字符,否则将引发异常。

items=list(df.Ticker.dropna().unique())
对于范围内的i(len(items)):
vars()

{k:d代表k,d在df.groupby('Ticker')}
@Quang-Hoang:谢谢。但是我想知道是否有其他方法可以创建单独的数据帧,而不是创建字典。有没有一种方法可以创建单独的数据帧,而不是字典?我更新了答案,解释了如何将数据帧创建为变量,但一般来说,我会警告您不要使用这种方法,因为它不太明确,而且很难调试。非常感谢您。对于第一种方法,如果我还想为每个dictionary元素Ticker的日期创建几个数据帧,该怎么办?例如,我有股票代码AAPL,在这个股票代码中,我还为2019年4月22日、2019年4月23日创建了小词典,…您只需要在循环中添加更多级别;i、 g.
对于日期时间列表中的日期:…
,然后根据日期向数据框添加更多过滤器。结果需要是一个嵌套字典,其中第一级键是ticker,第二级键是dates。