从字典创建数据框

时间:2019-10-15 21:04:01

标签: 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}

之后,我只能通过使用字典键传递切片来调用数据帧:

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)中使用轴= 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

2 个答案:

答案 0 :(得分:1)

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

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

在此列表上调用pd.concat-只要它们具有相同的列名,它就应该正确地将数据框一个接一个地连接。

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_list, ignore_index=True)

答案 1 :(得分:0)

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)

输出(带有我的数据):

         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

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