【问题标题】:Pandas Panel from Dict of Dataframes Returns NaNs来自 Dataframes 字典的 Pandas 面板返回 NaN
【发布时间】:2016-03-01 00:10:02
【问题描述】:

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

# 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 文件之一: example_csv_file

需要注意的可能(或可能不)重要的一点是每个数据帧的 dtypes 并不完全相同:

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

我做错了什么?

【问题讨论】:

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

标签: python pandas dataframe panel nan


【解决方案1】:

所有 NaN 的空面板的原因是您的 dates numpy 数组当前存储为 datetime64 类型。显然,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() 函数中的列表解析将返回一个仅包含 last 数据框的面板,重复 13 次。原因是下面的列表理解返回 dfs 列表和 dates 数组之间的总组合集,其长度等于两个集合的乘积:13 X 13(即交叉连接/笛卡尔连接)。输出如下:

[(date, df) for date in dates for df in dfs]

一旦你将dict() 应用到上面,你会强制13 个唯一的dates 携带最后一个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)]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-22
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多