Python 从dict创建数据帧

Python 从dict创建数据帧,python,dataframe,Python,Dataframe,首先,创建一个包含一些值的列表: list = ['SBSP3.SA', 'CSMG3.SA', 'CGAS5.SA'] 我创建了一个空字典,因为这是我找到它的唯一方法,可以读取我想要作为数据帧的几个.csv文件。然后我执行for循环,将.csv文件存储在空字典中: d = {} d = {ticker: pd.read_csv('{}.csv'.format(ticker)) for ticker in list} 之后,我只能通过使用字典键传递切片来调用dataframe: d['SB

首先,创建一个包含一些值的列表:

list = ['SBSP3.SA', 'CSMG3.SA', 'CGAS5.SA']
我创建了一个空字典,因为这是我找到它的唯一方法,可以读取我想要作为数据帧的几个.csv文件。然后我执行for循环,将.csv文件存储在空字典中:

d = {}

d = {ticker: pd.read_csv('{}.csv'.format(ticker)) for ticker in list}
之后,我只能通过使用字典键传递切片来调用dataframe:

d['SBSP3.SA'].head(5)

          Date   High     Low    Open   Close      Volume   Adj Close
0   2017-01-02  14.70   14.60   14.64   14.66    7525700.0  13.880955
1   2017-01-03  15.65   14.95   14.95   15.50   39947800.0  14.676315
2   2017-01-04  15.68   15.31   15.45   15.50   37071700.0  14.676315
3   2017-01-05  15.91   15.62   15.70   15.75   47586300.0  14.913031
4   2017-01-06  15.92   15.50   15.78   15.66   25592000.0  14.827814
例如,我不能:

df = pd.DataFrame(d)
我的问题是:

我可以合并我在字典(d)中抛出的所有这些数据帧(axis=1)以将其视为一个吗

在这里我打破了很多头绪,我设法把所有的数据帧放在一起,但是我丢失了它们的键,我无法区分谁是谁,因为列的名称是相同的

我可以在列中命名这些键吗

例如:

          Date    High_SBSP3.SA   Low_SBSP3.SA   Open_SBSP3.SA  Close_SBSP3.SA      Volume_SBSP3.SA   Adj Close_SBSP3.SA
0   2017-01-02            14.70          14.60           14.64           14.66            7525700.0          13.880955
1   2017-01-03            15.65          14.95           14.95           15.50           39947800.0          14.676315
2   2017-01-04            15.68          15.31           15.45           15.50           37071700.0          14.676315
3   2017-01-05            15.91          15.62           15.70           15.75           47586300.0          14.913031
4   2017-01-06            15.92          15.50           15.78           15.66           25592000.0          14.827814

不要使用
list
作为变量名,它会隐藏实际内置的
list

您不需要字典,一个简单的列表就足以存储所有数据帧

调用此列表-它应该正确地将数据帧一个接一个地连接起来,只要它们具有相同的列名

ticker_list = ['SBSP3.SA', 'CSMG3.SA', 'CGAS5.SA']
pd_list = [pd.read_csv('{}.csv'.format(ticker)) for ticker in ticker_list]
df = pd.concat(pd_list)
如果要在连接时重置索引,请使用
df=pd.concat(pd\u list,ignore\u index=True)

pd.merge将执行您想要的操作(包括重命名列),但由于它只允许一次合并两个帧,因此在重复合并时列名将不一致。因此,您需要在重新命名之前手动重命名列

import pandas as pd
from functools import reduce

ticker_list = ['SBSP3.SA', 'CSMG3.SA', 'CGAS5.SA']
pd_list = [pd.read_csv('{}.csv'.format(ticker)) for ticker in ticker_list]

for idx, df in enumerate(pd_list):
   old_names = df.columns[1:]
   new_names = list(map(lambda x : x + '_' + ticker_list[idx] , old_names))
   zipped = dict(zip(old_names, new_names))
   df.rename(zipped, axis=1, inplace=True)

def dfmerge(x, y):
    return pd.merge(x, y, on="date")

df = reduce(dfmerge, pd_list)
print(df)
输出(带我的数据):


提示:您可能需要编辑/删除您的评论。因为我更喜欢覆盖我以前的答案,而不是添加新答案。

运行时:df=pd.concat(pd_list,axis=1),我会丢失ticker_list中的所有值名称,并且我不知道谁是没有ticker名称的列。字典由键和值组成。有没有其他方法可以知道哪个条目属于哪个csv文件?我想在专栏中指出他们…@leonardo henriques:既然你两次发布了同一个问题:看,并将另一个问题标记为已回答,我很好奇你最终在寻找哪种解决方案。
         date  High_SBSP3.SA  Low_SBSP3.SA  Open_SBSP3.SA  High_CSMG3.SA  Low_CSMG3.SA  Open_CSMG3.SA  High_CGAS5.SA  Low_CGAS5.SA  Open_CGAS5.SA
0  2017-01-02              1             2              3              1             2              3              1             2              3
1  2017-01-03              4             5              6              4             5              6              4             5              6
2  2017-01-04              7             8              9              7             8              9              7             8              9