2017-06-29 53 views
1

我有兩個dataframes將從CSV文件中拉:組合兩個數據幀,並顯示它們的區別 - Python的熊貓

X  Value 1 Value 2 
0 1  2  1  
1 3  4  -2  
2 3  3  8  
3 -1  4  2  
4 6 -8  2  
5 0  10  1 

    X  Value 1 Value 2 
0 1  2  1  
1 3  4  -1  
2 3  4  8  
3 -1  4  2  
4 6 -8  2  
5 0  9  1 

我想用Python的大熊貓有這個樣子,哪裏會輸出成爲第二個數據幀,但對於已發生變化,將是一個加號的任何值/減去量的支架已經被改變了:

X  Value 1 Value 2 
0 1  2  1  
1 3  4  -1 (+1)  
2 3  4 (+1) 8  
3 -1  4  2  
4 6 -8  2  
5 0  9 (-1) 1 

唯一接近的解決方案,我發現在網上利用面板的事與已棄用,所以我想避免使用它們。另外我希望最終的輸出是一個數據框,以便我可以將樣式應用到它。

+0

值'X'在兩種'Dataframes'一樣嗎?兩個數據幀的長度是相同的? – jezrael

+0

你的例子沒有意義。第5行中的值1從10變爲9,爲什麼用(+1)符號取10?它應該是9和(-1)符號嗎?同樣,對於第2行的值1,符號應該是(+1)? – Allen

+0

數據框的長度和大小將始終相同,但您可以擁有一組更大的數據框,並且這應該仍然有效。第X列的值也可能改變。對不起,這是一個錯誤,我會編輯這個問題。 – dnlbaines

回答

2

您可以得到df2和df1之間的差異,並創建+或 - 標誌,然後將其附加到df2。

df2.astype(str) + \ 
(df2-df1).applymap(lambda x: ' ({}{})'\ 
        .format('+' if x > 0 else '', str(x)).replace('(0)','')) 

Out[240]: 
    X Value 1 Value 2 
0 1  2  1 
1 3  4 -1 (+1) 
2 3 4 (+1)  8 
3 -1  4  2 
4 6  -8  2 
5 0 9 (-1)  1  
2

您可以使用subapplymap第一個和最後adddf2轉換爲string S:

  • 如果兩個DataFrames的長度是相同
  • 如果指標值在兩個DataFrames
  • 如果相同列名同DataFrames

df = df2.sub(df1).applymap(lambda x: ' ({0:+d})'.format(x) if x != 0 else '') 
print (df) 
    X Value 1 Value 2 
0     
1    (+1) 
2  (+1)   
3     
4     
5  (-1) 

df3 = df2.astype(str).add(df) 
print (df3) 
    X Value 1 Value 2 
0 1  2  1 
1 3  4 -1 (+1) 
2 3 4 (+1)  8 
3 -1  4  2 
4 6  -8  2 
5 0 9 (-1)  1 
1

,不進行格式化能力:

(df2.astype(str)+"("+(df2-df1).astype(str)+")").applymap(
lambda s:s.replace("(0)","").replace("(","(+").replace("+-","-")) 

爲:列

X Value1 Value2 
0 1  2  1 
1 3  4 -1(+1) 
2 3 4(+1)  8 
3 -1  4  2 
4 6  -8  2 
5 0 9(-1)  1