我有一个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(甚至是其他数字)?
谢谢。
答案 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
,然后对每个小组采取行动,最后重新组合。