2013-02-19 73 views
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 [0] [ '日期2']与df.ix [1] [ '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(甚至是另一个数字)?

谢谢。

+0

谢谢大家的帮助。 – user1911092 2013-02-19 19:39:30

回答

3

这里还有一个在线的解决方案,可能是最“pandonic”:

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 
+0

而且就像DSM所说的,如果你有不同的同一个符号组的分组,你就不会有效。 – Zelazny7 2013-02-19 16:59:32

+0

加1使用.apply()我的解决方案使用for循环。我总是忘记申请。 – 2013-02-19 17:15:55

+1

你甚至可以用''df.groupby(“symbol”)。date.shift(-1)''''省略lambda函数。 groupby对象将分派到底层的Series/DataFrame方法(http://pandas.pydata.org/pandas-docs/stable/groupby.html#dispatching-to-instance-methods) – Garrett 2013-02-20 03:22:55

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,然后对每个组采取行动,最后重新组装。

1

为了与DSM的布尔解决方案进行比较,以下是快速且无痛苦的groupby解决方案!

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