2017-05-27 187 views
3

移位值假設DF的數據幀的一個例子:移動/在大熊貓數據幀

A 
0 4.3 
1 75 
2 8.5 
3 4.0 
4 98 

我需要每個值從A列移動到每一列 - 每列一個值:

  • 從第二值開始:移動到第二列B
  • 第三值到第三塔C
  • 等等...

所需的輸出:

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 

一個想法是給每個值複製到第二個欄,然後在以前的專欄或從一列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移動到第二行,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沿對角線然後將它與NaN如果使用replace方法取代了這種方式。

+2

如果他們將在原來的'df'中會發生'0'值? ;) – MaxU

+1

@MaxU謝謝。我對此的解決方案太接近您的變更答案。我會做筆記。 – spies006