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、 它们是否都有相同的列?是的,它们在数据帧之间都是相同的