【发布时间】:2014-06-16 05:25:24
【问题描述】:
我想按日期迭代数据框的主轴日期。
示例:
tdf = df.ix[date]
我遇到的问题是 df.ix 返回的类型发生了变化,给我留下了 3 种可能的情况
-
如果
tdf中不存在日期,则会引发错误:KeyError: 1394755200000000000 -
如果
tdf中只有一项:print type(tdf)返回<class 'pandas.core.series.Series'> -
如果
tdf中有多个项目:print type(tdf)返回<class 'pandas.core.frame.DataFrame'>
为了避免第一种情况,我可以简单地将其包装在 try catch 块中,或者感谢 jxstanford,我可以使用 if date in df.index: 避免 try catch 块
后来我遇到了这个问题,API 与 pandas 系列和 pandas 数据框不一致。我可以通过检查类型来解决这个问题,但似乎我不应该这样做。理想情况下,我希望保持类型相同。有更好的方法吗?
我正在运行 pandas 0.13.1,我目前正在使用 CSV 从 CSV 加载数据
这是一个演示问题的完整示例。
from pandas import DataFrame
import datetime
path_to_csv = '/home/n/Documents/port/test.csv'
df = DataFrame.from_csv(path_to_csv, index_col=3, header=0, parse_dates=True, sep=',')
start_dt = df.index.min()
end_dt = df.index.max()
dt_step = datetime.timedelta(days=1)
df.sort_index(inplace=True)
cur_dt = start_dt
while cur_dt != end_dt:
if cur_dt in df.index:
print type(df.ix[cur_dt])
#run some other steps using cur_dt
cur_dt += dt_step
演示该问题的示例 CSV 如下:
value1,value2,value3,Date,type
1,2,4,03/13/14,a
2,3,3,03/21/14,b
3,4,2,03/21/14,a
4,5,1,03/27/14,b
上面的代码打印出来
<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>
是否可以以一致的方式从 tdf 获取 value1 的值?还是我坚持为每个案例做一个 if 语句并分别处理?
if type(df.ix[cur_dt]) == DataFrame:
....
if type(df.ix[cur_dt]) == Series:
....
【问题讨论】:
-
您可以使用
unique获得所有日期的唯一列表,然后遍历该列表。 -
@KarlD。我需要其他所有日期,而不仅仅是数据框中缺少许多日期的唯一值。
-
尝试使用 DataFrame.from_csv 而不是 pandas.read_csv。这可能有助于解决您的问题 2 和 3。
-
你真的必须提供更多的细节,一个初学者的玩具数据集。你得到的行为是预期的:如果你提取一行,你得到一个系列(一维数组),如果你提取多行,它是一个 DataFrame(二维数组)。如果你告诉 pandas 寻找不存在的东西,它会给你一个错误。如果你解释你想要的结果是什么(一列?更多列?),那么有一些方法可以处理所有这些问题。
-
@jxstanford 谢谢我试过你的建议我仍然遇到同样的问题,
标签: pandas dataframe iteration