结合两个数据框并显示它们的区别 - Python Pandas

时间:2017-06-29 09:04:15

标签: python pandas

我有两个数据帧将从CSV文件中提取:

   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 Pandas来获得这样的输出,它将是第二个数据框,但是对于任何已经改变的值,它将在其更改量的括号内加上/减去: / p>

   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 

我在网上找到的解决方案中唯一接近使用Panels的解决方案已被弃用,所以我想避免使用它们。此外,我希望最终输出为数据帧,以便我可以应用样式。

3 个答案:

答案 0 :(得分:2)

您可以sub使用applymap第一个和最后add原始df2转换为string

  • 如果两个DataFrame的长度相同
  • 如果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 :(得分: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 :(得分:1)

没有格式化技巧:

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

for:

    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