在pandas中的数据帧之间减去行

时间:2017-08-02 07:19:42

标签: python pandas dataframe data-analysis

我有两个数据帧,

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

3 个答案:

答案 0 :(得分:5)

使用pd.Series.isin

df1[~df1.Name.isin(df2.Name)]

    Name  std
0  kumar    8
1   Ravi   10

答案 1 :(得分: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

答案 2 :(得分:0)

你"数字"不是数字而是字符串。首先让他们成为数字。如果只有一些列是数字,请在转换前选择它们:

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