所以这里有一个问题,我花了一段时间才弄清楚为什么会发生...
我有一个dataframe的值与工作日的日期时间索引。
添加一个新列'ColB',它的值总是与colA相同,除了colA为0。然后我想使用colA的 previous days值。
举例来说:
| 一个|B| B |
| --|--| ------------ |
| 七|七| 7 |
| 三个|三个| 3 |
| 0|三个| 3 |
| 五|五| 5 |
| 0|五| 5 |
注意2019-11-13上的colB如何变成2019-11-12上的colA的值。15日也是:colB从第14位取colA。
我使用了这个列表解析:
df.loc[:,'colB'] = [df.loc[d-pd.Timedelta(1,'d'),'ColA'] if df.loc[d,'ColA']==0 else df.loc[d,'ColA'] for d in df.index]
字符串
我以为它不工作(KeyError:Timestamp('2019 -11-03 00:00:00')),但我发现问题的发生是因为我在星期一有一个零,因此没有d-pd.Timedelta(1,'d')
的行,这将是一个星期天。
我想同样的问题也会发生在我假期后的第二天。
为了解决这个问题,当col A为零时,我实际上需要使用colA中的前一个值作为colB,而不是前一个DAYS值,就像我在列表解析中所做的那样。
我通过重新索引解决了这个问题,使用序列号而不是日期,但我认为使用日期更好。
我试过shift:
df.loc[:,'colB'] = [df.loc[d,'ColA'].shift(-1) if df.loc[d,'ColA']==0 else df.loc[d,'ColA'] for d in df.index]
型
但是得到一个错误:AttributeError: 'numpy.int64' object has no attribute 'shift'
个
有谁能想到一个简单的方法来做到这一点,而无需重新索引?
谢谢你,谢谢
2条答案
按热度按时间8gsdolmq1#
试试这个:
字符串
输出量:
型
afdcj2ne2#
您可以使用
shift()
方法将索引移动给定的周期数。shift()
向下滑动值(而不是索引),可用于根据前一行的值填充列中缺失的值。您可以将其与
where()
函数结合使用,该函数将替换条件为False的值。字符串
这将创建一个新的列'ColB',并在'ColA'不为零时为其赋值'ColA'。如果'ColA'为零,则它取'ColA'前一行的值。
要同时处理第一行,请使用
fillna()
函数。此函数将NA/NaN值替换为指定值。在下面的例子中,如果'ColA'的第一行为0,它将被'ColA'的第二个值替换。如果要用其他值替换,可以用所需的值替换下面的
df['ColA'][0]
。型