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]['date2'] を 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 (または別の数値) を置き換える方法は?

ありがとうございました。

4

3 に答える 3

3

そして、これが最も「パニック」になる可能性のある1行のソリューションです。

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 に答える