2017-05-27 3 views
3

データフレームDFの例を仮定すると:パンダデータフレームに移動/シフト値

A 
0 4.3 
1 75 
2 8.5 
3 4.0 
4 98 

Iが各列に列Aから各値を移動する必要がある - 列ごとに値:

を第二の値から開始
  • :第二カラムBへの移行、
  • 3列Cに第3の値、
  • のように...

所望の出力:

A  B C D E 
0 4.3 NaN NaN NaN NaN 
1 NaN 75 NaN NaN NaN 
2 NaN NaN 8.5 NaN NaN 
3 NaN NaN NaN 4.0 NaN 
4 NaN NaN NaN Nan 98 

ひとつのアイデアは、第二の列にそれぞれの値をコピーして、前回のコラムで、または1つの列からshift値にそれを消去しました他に私はこれを適用するかどうかはわかりません...

MWE

import pandas as pd 
import numpy as np 

df=pd.DataFrame(data=np.random.randint(0,100,(5,5)), columns=['A','B','C','D','E']) 
df.iloc[:,1:] =np.nan 

df.iloc[[1],[1]] = df.iloc[[1],[0]] 
df.iloc[[1],[1]] = df.iloc[[1],[0]].shift(1,axis=1) 

答えて

5
In [76]: import string 

In [77]: r = pd.DataFrame(np.eye(len(df)), 
          columns=list(string.ascii_uppercase[:len(df)])) \ 
       .replace(0, np.nan) * df.A.values 

In [78]: r 
Out[78]: 
    A  B C D  E 
0 4.3 NaN NaN NaN NaN 
1 NaN 75.0 NaN NaN NaN 
2 NaN NaN 8.5 NaN NaN 
3 NaN NaN NaN 4.0 NaN 
4 NaN NaN NaN NaN 98.0 

以上:

In [11]: r = pd.DataFrame(index=df.index, columns=list(string.ascii_uppercase[:len(df)])) 

In [12]: np.fill_diagonal(r.values, df.A) 

In [13]: r 
Out[13]: 
    A B C D E 
0 4.3 NaN NaN NaN NaN 
1 NaN 75 NaN NaN NaN 
2 NaN NaN 8.5 NaN NaN 
3 NaN NaN NaN 4 NaN 
4 NaN NaN NaN NaN 98 

UPDATE:

がどのように "移動" するための単一の値

我々はSeries.shiftメソッドを使用することができます。

水平移動:縦

In [94]: r.loc[1] = r.loc[1].shift(3) 

In [95]: r 
Out[95]: 
    A B C D  E 
0 4.3 NaN NaN NaN NaN 
1 NaN NaN NaN NaN 75.0 
2 NaN NaN 8.5 NaN NaN 
3 NaN NaN NaN 4.0 NaN 
4 NaN NaN NaN NaN 98.0 

移動:

In [96]: r.loc[:, 'D'] = r.loc[:, 'D'].shift(-2) 

In [97]: r 
Out[97]: 
    A B C D  E 
0 4.3 NaN NaN NaN NaN 
1 NaN NaN NaN 4.0 75.0 
2 NaN NaN 8.5 NaN NaN 
3 NaN NaN NaN NaN NaN 
4 NaN NaN NaN NaN 98.0 

注:shiftは、すぐに私たちは、それぞれに一つの値だけを持つよう全体行/列をシフトしますが、行/列が有効になります。

+0

ありがとうございました!列Aから任意の列や行に値を移動する方法を知っていますか?斜めではありませんか? – Michal

+0

@Michal、再現可能な例ができますか? – MaxU

+0

たとえば、値75を列Dまたは8.5を列Eに移動するには、8.5を2列目の列Eに移動することもできます。 – Michal

3
>>> import pandas as pd 
>>> import numpy as np 
>>> df = pd.DataFrame({'A':[4.3, 75, 8.5, 4.0, 98]}) 
>>> df 
     A 
0 4.3 
1 75.0 
2 8.5 
3 4.0 
4 98.0 


>>> diag_df = pd.DataFrame(np.diag(df.A), index=df.index, columns=['A', 'B', 'C', 'D', 'E']) 
>>> diag_df.replace(0, np.nan, inplace=True) 
>>> diag_df 
    A  B C D  E 
0 4.3 NaN NaN NaN NaN 
1 NaN 75.0 NaN NaN NaN 
2 NaN NaN 8.5 NaN NaN 
3 NaN NaN NaN 4.0 NaN 
4 NaN NaN NaN NaN 98.0 

あなたは対角線に沿って0を持っている場合は、replace方法この方法を使用する場合、それがNaNに置き換えられますことに注意してください。

+2

元の 'df'にある場合、' 0'値はどうなりますか? ;) – MaxU

+1

@マックスありがとうございます。これに対する私の解決策は、あなたの答えに近すぎるものです。私はメモをします。 – spies006

関連する問題