2017-03-03 8 views
1

私は立ち往生して助けが必要です。私は以下のデータフレームを持っています:pandasのデータフレームを列に追加します

+-----+---+---+--+--+ 
|  | A | B | | | 
+-----+---+---+--+--+ 
| 288 | 1 | 4 | | | 
+-----+---+---+--+--+ 
| 245 | 2 | 3 | | | 
+-----+---+---+--+--+ 
| 543 | 3 | 6 | | | 
+-----+---+---+--+--+ 
| 867 | 1 | 9 | | | 
+-----+---+---+--+--+ 
| 345 | 2 | 7 | | | 
+-----+---+---+--+--+ 
| 122 | 3 | 8 | | | 
+-----+---+---+--+--+ 
| 233 | 1 | 1 | | | 
+-----+---+---+--+--+ 
| 346 | 2 | 6 | | | 
+-----+---+---+--+--+ 
| 765 | 3 | 3 | | | 
+-----+---+---+--+--+ 

列Aは、次のような値を繰り返しています。

+-----+---+---+-----+ 
|  | A | B | C | 
+-----+---+---+-----+ 
| 288 | 1 | 4 | 9 | 
+-----+---+---+-----+ 
| 245 | 2 | 3 | 7 | 
+-----+---+---+-----+ 
| 543 | 3 | 6 | 8 | 
+-----+---+---+-----+ 
| 867 | 1 | 9 | 1 | 
+-----+---+---+-----+ 
| 345 | 2 | 7 | 6 | 
+-----+---+---+-----+ 
| 122 | 3 | 8 | 3 | 
+-----+---+---+-----+ 
| 233 | 1 | 1 | NaN | 
+-----+---+---+-----+ 
| 346 | 2 | 6 | NaN | 
+-----+---+---+-----+ 
| 765 | 3 | 3 | NaN | 
+-----+---+---+-----+ 

ありがとう:私は何をしたい私は、以下のようにC列として列Bから対応する値を持つ新しいcolumを追加したい列A中の繰り返し値を見るたびです。 valが繰り返される値の一つである、

slice = df.loc[df.A == val, 'B'].shift(-1) 

が新しい位置に再インデックス値を持つ1列のデータフレームを作成すると仮定すると

+0

あなたの場所はどこですか? – blacksite

+0

あなたの最善の策のような音は、 'df.groupby( 'A')'の出力を操作することです。 – BallpointBen

答えて

0

再割り当てされたインデックス値のいずれも重複しないようにするため、pandas.concatを使用して、データを失うことなく複数のスライスをつなぎ合わせることができます。それからちょうど新しい列としてそれらを添付:最大

列が割り当てられている
df['C'] = pd.concat([df.loc[df['A'] == x, 'B'].shift(-1) for x in [1, 2, 3]]) 

は、インデックス値はすべての行を行います:

A B C 
0 1 4 9.0 
1 2 3 7.0 
2 3 6 8.0 
3 1 9 1.0 
4 2 7 6.0 
5 3 8 3.0 
6 1 1 NaN 
7 2 6 NaN 
8 3 3 NaN 
+0

ありがとう。これは機能します。 – magicsword

0

は、データフレームの順序を逆にし、シフト機能に対してそれを変換GROUPBY、それを元に戻します:

df = df[::-1] 
df['C'] = df.groupby(df.columns[0]).transform('shift') 
df = df[::-1] 
df 

    A B  C 
0 1 4 9.0 
1 2 3 7.0 
2 3 6 8.0 
3 1 9 1.0 
4 2 7 6.0 
5 3 8 3.0 
6 1 1 NaN 
7 2 6 NaN 
8 3 3 NaN 
関連する問題