Pandas 按日期迭代数据帧的正确方法
我想逐日期迭代数据帧的长轴 示例:Pandas 按日期迭代数据帧的正确方法,pandas,dataframe,iteration,Pandas,Dataframe,Iteration,我想逐日期迭代数据帧的长轴 示例: tdf=df.ix[日期] 我遇到的问题是,df.ix返回的类型发生了变化,给我留下了3种可能的情况 如果日期不存在于tdf中,则抛出一个错误:KeyError:1394755200000000 如果tdf中只有一项:打印类型(tdf)返回 如果tdf中有多个项目:打印类型(tdf)返回 为了避免第一种情况,我可以简单地将其包装在try-catch块中,或者感谢jxstanford,我可以通过使用df.index:if-date来避免try-catc
tdf=df.ix[日期]
我遇到的问题是,df.ix
返回的类型发生了变化,给我留下了3种可能的情况
tdf
中,则抛出一个错误:KeyError:1394755200000000
tdf
中只有一项:打印类型(tdf)
返回
tdf
中有多个项目:打印类型(tdf)
返回
try-catch
块中,或者感谢jxstanford,我可以通过使用df.index:if-date来避免try-catch块
后来,我遇到了一个与pandas系列和pandas数据帧不一致的API问题。我可以通过检查类型来解决这个问题,但似乎我不应该这样做。理想情况下,我希望保持类型不变。有更好的方法吗
我正在运行pandas 0.13.1,目前正在使用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
演示该问题的示例如下所示:
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 = DataFrame.from_csv(path_to_csv, index_col=3, header=0, parse_dates=True, sep=',')
while cur_dt != end_dt:
if cur_dt in df.index:
# do your thing
cur_dt += dt_step
您可以使用数据框的
apply
方法,使用axis=1
处理数据框的每一行,以构建具有相同索引的系列
e、 g
修改示例输入,如下所示
value1 value2 value3 type NewValue date
Date
2014-03-13 1 2 4 a 7 2014-03-13
2014-03-21 2 3 3 b 0 2014-03-21
2014-03-21 3 4 2 a 0 2014-03-21
2014-03-27 4 5 1 b 20 2014-03-27
[4 rows x 6 columns]
这个玩具代码将一致地返回数据帧
def framer(rows):
if ndim(rows) == 1:
return rows.to_frame().T
else:
return rows
for cur_date in df.index:
print type(framer(df.ix[cur_date]))
这将给你失去的日子:
df.resample(rule='D')
请看一下重采样方法docstring。它有自己的选项来填充丢失的数据。如果您决定将多个日期合并为一个日期,那么您正在使用的方法是分组方式(如果您希望跨行合并值)和删除重复的日期(如果您希望忽略它们)。无需重新设计轮子。您可以使用
unique
获得所有日期的唯一列表,然后迭代该列表。@KarlD。我需要其他内容的所有日期,而不仅仅是数据框中缺少的唯一值。请尝试使用dataframe.from_csv而不是pandas.read_csv。这可能有助于解决问题2和问题3。您确实需要提供更多细节,一个玩具数据集供初学者使用。您将获得的行为是预期的:如果您提取一行,您将获得一个系列(一维数组),如果您提取多行,它将是一个数据帧(二维数组)。如果你告诉熊猫去寻找不存在的东西,它会给你一个错误。如果你解释了你想要的结果(一个专栏?更多专栏?),有很多方法可以解决所有这些问题。@jxstanford谢谢我尝试了你的建议,我仍然遇到同样的问题,这确实有帮助!但我遇到了其他问题,我会更新这个问题
def framer(rows):
if ndim(rows) == 1:
return rows.to_frame().T
else:
return rows
for cur_date in df.index:
print type(framer(df.ix[cur_date]))
df.resample(rule='D')