Python 数据帧Dict中的Pandas面板返回NAN

Python 数据帧Dict中的Pandas面板返回NAN,python,pandas,dataframe,panel,nan,Python,Pandas,Dataframe,Panel,Nan,我有一组数据帧,我正试图把它们变成一个面板。 这是我的密码: # OPEN THE FILES INTO DATAFRAMES filenames = ['Yahoo_2016-01-17.csv', 'Yahoo_2016-01-18.csv', 'Yahoo_2016-01-19.csv','Yahoo_2016-01-23.csv','Yahoo_2016-01-27.csv', 'Yahoo_2016-02-05.csv', 'Yahoo_2016-02-06.

我有一组数据帧,我正试图把它们变成一个面板。 这是我的密码:

# OPEN THE FILES INTO DATAFRAMES
filenames = ['Yahoo_2016-01-17.csv', 'Yahoo_2016-01-18.csv',
    'Yahoo_2016-01-19.csv','Yahoo_2016-01-23.csv','Yahoo_2016-01-27.csv',     
    'Yahoo_2016-02-05.csv', 'Yahoo_2016-02-06.csv', 'Yahoo_2016-02-09.csv',     
    'Yahoo_2016-02-11.csv', 'Yahoo_2016-02-13.csv', 'Yahoo_2016-02-15.csv', 
    'Yahoo_2016-02-16.csv', 'Yahoo_2016-02-29.csv']

dates = np.array(['2016-01-17', '2016-01-18', '2016-01-19', '2016-01-23', 
    '2016-01-27', '2016-02-05', '2016-02-06','2016-02-09', 
    '2016-02-11', '2016-02-13', '2016-02-15', '2016-02-16',
    '2016-02-29']).astype('datetime64[D]')

filepath = '/Users/RickS/Documents/Investing/Stock_files/GENERAL/'

dfs = [pd.read_csv(filepath+f) for f in filenames]

# Panel not working...
panel = pd.Panel(dict([(date, df) for date in dates for df in dfs]))
panel.swapaxes('major','minor')
但是,当我尝试读取面板时,每个数据帧中的所有值都变成了NaN:

当我单独查看数据帧时,它们看起来都很好。 以下是导入df的csv文件之一:

需要注意的一点可能很重要(也可能不重要),即每个数据帧的数据类型并不完全相同:

In [24]: dfs[1].dtypes
Out[24]: 
Name                          object
Symbol                        object
Previous_Close               float64
Average_Daily_Volume           int64
Change_&_Percent_Change       object
Earnings/Share               float64
EPS_Estimate_Current_Year    float64
EPS_Estimate_Next_Quarter    float64
EPS_Estimate_Next_Year       float64
52-week_Low                  float64
52-week_High                 float64
EBITDA                        object
200-day_Moving_Average       float64
P/E_Ratio                    float64
PEG_Ratio                    float64
Short_Ratio                  float64
1_yr_Target_Price            float64
52-week_Range                 object
Date                          object
dtype: object

我做错了什么?

带有所有NAN的空面板的原因是当前存储为
datetime64
类型的
dates
numpy数组。显然,pandas面板对象不能很好地与底层字典键配合使用

只需删除
astype
,甚至使用一个列表或元组即可将日期呈现为字符串键。但是,由于字典键是通过天数来衡量的,因此每个键都将根据您的面板需要而具有唯一性

dates = np.array(['2016-01-17', '2016-01-18', '2016-01-19', '2016-01-23', 
                  '2016-01-27', '2016-02-05', '2016-02-06','2016-02-09', 
                  '2016-02-11', '2016-02-13', '2016-02-15', '2016-02-16',
                  '2016-02-29'])

dates = ['2016-01-17', '2016-01-18', '2016-01-19', '2016-01-23', 
         '2016-01-27', '2016-02-05', '2016-02-06','2016-02-09', 
         '2016-02-11', '2016-02-13', '2016-02-15', '2016-02-16',
         '2016-02-29']
然而,这带来了我先前的发现。目前,
dict()
函数中的列表理解将返回一个仅包含最后一个数据帧的面板,重复13次。原因是下面的列表理解返回
dfs
列表和
dates
数组之间的总组合集,长度等于两个集合的乘积:13 X 13(即交叉联接/笛卡尔联接)。要查看以下输出:

[(date, df) for date in dates for df in dfs]
一旦您将
dict()
应用到上面,您将强制13个唯一的
日期
携带最后一个
df
的值,实质上是拉入最后一个组合对

考虑使用
zip()

dfDict = {}
for f,d in zip(filenames, dates):    
    dfDict[d] = pd.read_csv(filepath+f)    

panel = pd.Panel(dfDict)
或较短者:

dfs = [pd.read_csv(filepath+f) for f in filenames] 
panel = pd.Panel(dict([i for i in zip(dates, dfs)]))

有趣!如果您的示例是自包含的——如果您提供了产生相同问题的示例数据,那么帮助您会更容易。这个网站解释得更好:没有实际数据,我们无法复制。在
dict()
中,您的列表理解有一个问题,我几乎贴出了一个答案,但在我所有的试验中,我无法重新创建所有的NAN。您的
日期
文件名
长度是否相同?另外,将其保存到字典中,
dict([(日期,df)表示dfs中df的日期])
并输出其内容。你看到NaNs了吗?我编辑了这个问题以包含更多细节,包括更完整的代码和一个作为数据帧读取的csv文件。我测试了上面定义的字典——dict([(date,df)表示dfs中df的日期中的日期]——结果很好(所有数据都在那里)。“日期”和“文件名”的长度均为13。即使数据帧中的列不相同,但在数据帧之间是否相同?i、 它们是否都有相同的列?是的,它们在数据帧之间都是相同的