2013-02-19 72 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']