2017-08-02 69 views
1

我有两个dataframes,减去数据帧之间排在熊猫

df1 
Name | std 
kumar | 8 
Ravi | 10 
Sri | 2 
Ram | 4 


df2, 
Name | std 
Sri | 2 
Ram | 4 

我想减去DF1 DF2行,我试过了,

df1.subtract(df2,fill_value=None) 

,但我得到的错误,

TypeError: unsupported operand type(s) for -: 'str' and 'str' 

我的理想输出,

df3 
Name | std 
kumar | 8 
Ravi | 10 
+0

目前尚不清楚是什么列名在“数据帧”。 'subtract'方法将匹配匹配索引和列的数据帧(即使索引名称需要相同)。尝试粘贴'df.iloc [:5,:5]'的输出,以便我们更好地了解您的数据是什么样的。 – Alexander

回答

2

您的使用merge与参数indicator和外连接,query进行过滤,然后用drop删除辅助柱:

DataFrames被连接上的所有列,因此on参数可以被省略。

df1 = pd.DataFrame({'Name':['kumar','Ravi','Sri','Ram'], 
        'std':[8,10,2,4], 
        'col':list('abcd')}) 
print (df1) 
    Name col std 
0 kumar a 8 
1 Ravi b 10 
2 Sri c 2 
3 Ram d 4 

df2 = pd.DataFrame({'Name':['Sri','Ram'], 
        'std':[2,4], 
        'col':list('cd')}) 
print (df2) 
    Name col std 
0 Sri c 2 
1 Ram d 4 

df3 = pd.merge(df1, df2, how='outer', indicator=True) 
     .query('_merge=="left_only"') 
     .drop('_merge',1) 
print (df3) 
    Name col std 
0 kumar a 8 
1 Ravi b 10 
+0

试过,仍然得到相同的错误 – pyd

+0

有更多的字符串列? – jezrael

+0

是的,有更多的列 – pyd

0

你“数字”不是数字,而是字符串。先让他们数字。如果只有一些列是数字,转换之前选择它们:

numeric = ["c1", "c2", "c3", ...] # All numeric columns 
df1.set_index('Name')[numeric].astype(int) \ 
- df2.set_index('Name')[numeric].astype(int) 
+0

我们可以改变,但我有更多的字符串列 – pyd

+0

然后你必须在减法之前选择数字列。查看更新的答案。 – DyZ