1

我有一个df

df:
  date     shares  symbol  date2
0 20120614  1100   AAT.N   NaN
1 20120615  1100   AAT.N   NaN
2 20120616  1100   AAT.N   NaN
3 20120617  1100   AAT.N   NaN
4 20030405  800    ABT.N   NaN
5 20030406  800    ABT.N   NaN
6 20030407  800    ABT.N   NaN
...

#This is what I want:
df:
  date     shares  symbol  date2
0 20120614  1100   AAT.N   20120615
1 20120615  1100   AAT.N   20120616
2 20120616  1100   AAT.N   20120617
3 20120617  1100   AAT.N   NaN
4 20030405  800    ABT.N   20030406
5 20030406  800    ABT.N   20030407
6 20030407  800    ABT.N   NaN
...

我想用 df.ix[1]['date2'] 替换每个符号的 df.ix[0]['date2'] - 符号在数据帧中发生变化,所以我不能只在整个数据帧中应用它.

我要循环遍历,如果 i 和 i+1 的符号匹配:

df.ix[i]['symbol'] == df.ix[i+1]['symbol']

我打算用日期替换 NaN。

我试过:

df.ix[i]['date2'] = df.ix[i+1]['date']  ##This failed.

然后我尝试了:

a = df.ix[i+1]['date']
df.replace({'date2': i}, a)
###This failed as well

这里有任何建议

1) 完成此任务的最佳过程?

2) 基本问题:如何在 pandas DF 中替换 NaN(甚至是另一个数字)?

谢谢你。

4

3 回答 3

3

这是一个可能是最“流行”的单线解决方案:

In [8]: df['date2'] = df.groupby('symbol').apply(lambda x: x['date'].shift(-1))

In [9]: df
Out[9]:
       date  shares symbol     date2
0  20120614    1100  AAT.N  20120615
1  20120615    1100  AAT.N  20120616
2  20120616    1100  AAT.N  20120617
3  20120617    1100  AAT.N       NaN
4  20030405     800  ABT.N  20030406
5  20030406     800  ABT.N  20030407
6  20030407     800  ABT.N       NaN
于 2013-02-19T16:56:33.867 回答
1

为了与 DSM 的布尔解决方案进行比较,这里是快速无痛的 groupby 解决方案!

grouped = df.groupby('symbol')
for _, group in grouped:
    df1['date2'][group.index] = group.shift(-1)['date']
于 2013-02-19T16:09:24.140 回答
0

我可能会做这样的事情:

>>> df
       date  shares symbol  date2
0  20120614    1100  AAT.N    NaN
1  20120615    1100  AAT.N    NaN
2  20120616    1100  AAT.N    NaN
3  20120617    1100  AAT.N    NaN
4  20030405     800  ABT.N    NaN
5  20030406     800  ABT.N    NaN
6  20030407     800  ABT.N    NaN
>>> same_symbols = df['symbol'] == df['symbol'].shift(-1)
>>> df['date2'][same_symbols] = df['date'].shift(-1)
>>> df
       date  shares symbol     date2
0  20120614    1100  AAT.N  20120615
1  20120615    1100  AAT.N  20120616
2  20120616    1100  AAT.N  20120617
3  20120617    1100  AAT.N       NaN
4  20030405     800  ABT.N  20030406
5  20030406     800  ABT.N  20030407
6  20030407     800  ABT.N       NaN

这会找到从一行到下一行的符号相同的位置:

>>> same_symbols
0     True
1     True
2     True
3    False
4     True
5     True
6    False
Name: symbol, Dtype: bool

然后在那里应用移位的日期:

>>> df['date'].shift(-1)
0    20120615
1    20120616
2    20120617
3    20030405
4    20030406
5    20030407
6         NaN
Name: date, Dtype: float64

这假设符号数据是连续的并且已经排序(如果不是这样的话,很容易强加。)

或者,您可以使用groupby然后对每个组采取行动,最后重新组装。

于 2013-02-19T16:05:55.307 回答