替换问题 - pandas数据帧

时间:2013-02-19 15:43:10

标签: python pandas

我有一个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)基本问题:如何在熊猫DF中替换NaN(甚至是其他数字)?

谢谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

grouped = df.groupby('symbol')
for _, group in grouped:
    df1['date2'][group.index] = group.shift(-1)['date']

答案 2 :(得分: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,然后对每个小组采取行动,最后重新组合。