【发布时间】:2018-06-04 10:29:23
【问题描述】:
我在数据框中有一个表格,其中年份列范围为 2001-2018,单元格值范围为 1-9。我正在尝试遍历我的原始数据框,并且对于每个记录/行,在最近出现的“9”之后附加该行的所有值。有一些条件要求,但我遇到的问题的症结在于将切片行放入我可以导出的新数据框中。它目前在 80,000 条记录上运行,并且只完成了 8,000 条,因此效率相当低。我也很有信心它不会保留整行,而是将每行的最后一个值设置为新数据框中的所有单元格值。
这是我的数据框作为字典的输出:
{2001L: {0: nan, 1: nan, 2: nan, 3: nan, 4: nan},
2002L: {0: 8.0, 1: nan, 2: nan, 3: nan, 4: nan},
2003L: {0: nan, 1: 8.0, 2: 7.0, 3: 8.0, 4: 8.0},
2004L: {0: nan, 1: nan, 2: 8.0, 3: 6.0, 4: 8.0},
2005L: {0: 8.0, 1: 8.0, 2: nan, 3: nan, 4: nan},
2006L: {0: nan, 1: 8.0, 2: nan, 3: 8.0, 4: 9.0},
2007L: {0: nan, 1: 7.0, 2: nan, 3: nan, 4: nan},
2008L: {0: 8.0, 1: 8.0, 2: nan, 3: 8.5, 4: 8.0},
2009L: {0: nan, 1: 8.0, 2: nan, 3: 8.0, 4: 8.0},
2010L: {0: nan, 1: 8.0, 2: 8.0, 3: 8.0, 4: 8.0},
2011L: {0: nan, 1: 8.0, 2: nan, 3: 8.0, 4: 8.0},
2012L: {0: nan, 1: 8.0, 2: nan, 3: 8.0, 4: 8.0},
2013L: {0: nan, 1: 7.0, 2: nan, 3: 8.0, 4: 8.0},
2014L: {0: nan, 1: 7.0, 2: nan, 3: 8.0, 4: 8.0},
2015L: {0: nan, 1: 8.0, 2: nan, 3: nan, 4: nan},
2016L: {0: 8.0, 1: 9.0, 2: nan, 3: 7.0, 4: 8.0},
2017L: {0: nan, 1: 9.0, 2: nan, 3: 7.0, 4: 8.0},
2018L: {0: nan, 1: nan, 2: nan, 3: 7.0, 4: 9.0},
'SegmentID': {0: 15, 1: 16, 2: 17, 3: 18, 4: 19},
'index': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}}
这是我试图作为字典接收的输出。
{'Year0': {0: 9, 1: 9, 2: 9},
'Year1': {0: 9.0, 1: nan, 2: 9.0},
'Year2': {0:None, 1: None, 2: None},
'index': {0: 5, 1: 7, 2: 8}}
这是我试图解决这个问题的代码。
for row in df_ratings_pivot.itertuples():
for i in range(len(df_ratings_pivot.columns)):
if row[i] == 9 and row[i-1] <=7 and row[i-2] <= 7:
for j in range(0,len(df_ratings_pivot.columns)-i):
for k in range(i,len(df_ratings_pivot.columns)):
df_new.set_value(row[0],'Year'+str(j),row[k])
print row, j, row[k]
谢谢!
编辑 嗨伊恩,这是我用来修改我的数据框的代码。它和你的很相似。我可以看到的唯一区别是我正在重新索引 df 以将 segID 放到字段列表的末尾,因此它不会影响切片
df_ratings_pivot
df2 = df_ratings_pivot.loc[df_ratings_pivot[df_ratings_pivot ==9].dropna(how = 'all').index]
df2 = df2.reset_index()
cols = df2.columns.tolist()
cols.insert(20, cols.pop(cols.index('SegmentID')))
df2 = df2.reindex(columns=cols)
df2
df2 = df2.astype(str)
df3 = df2.loc[:, df2.max().idxmax():]
df3
我刚刚注意到 idxmax 的拼写错误。所以我修复了这个问题并且代码可以工作,但我现在只提取最后一个 segmentID 列,没有别的。我想这是有道理的,因为您的代码最初没有考虑位于 df 末尾的具有如此高值的 segID 字段。无论如何保留 SegmentID 而不会弄乱切片?
编辑 2
好的,所以我做了您的更改,这里是我的屏幕截图形式的结果,希望能加快这个过程。第一个屏幕截图是我将 DF 转换为可以由您的代码修改的格式。第二部分是代码的结果。
似乎正在提取额外信息。例如,记录 1 应该从 2016 年开始,因为这是第一次出现 9。第一个记录应该只有 2016 和 2017 年的值.也许我应该创建一个新的数据框并将其附加到其中而不是从现有的数据框中切片?
我的最终目标数据框将从任意 Year0 字段名称开始,该字段名称将填充一堆 9。第 0 年之后的所有内容都将填充相应的记录值……在最初的 9 之后。因此对于记录 1、2 和 3,它将变为:
{Year0: {0: 9, 1: 9, 2: 9, ...},
Year1: {0: 9, 1:nan,2:9, ...},
Year2: {0: nan, 1: 8, 2: nan, ...},}
【问题讨论】:
-
请发布您的原始数据框(可能是
df.to_dict())和预期的输出。 -
我应该用 df.to_dict() 的整个输出来编辑上面的内容吗?预期输出是指我希望收到的最终数据帧,其值以所需的方式排列吗?谢谢你的回复,顺便说一句
-
@CambrianCatalyst,“您所说的预期输出是指我希望接收的最终数据帧,其值以所需方式排列吗?” -- 是的。
-
@CambrianCatalyst 如果
df太大,你可以取一个有意义的样本。 -
非常感谢。我已经用我认为正确的信息编辑了我的父消息。如果我在某个地方搞砸了,我很抱歉。再次感谢大家的帮助!
标签: python-2.7 pandas dataframe append slice