如何从熊猫数据框中减去熊猫系列?

时间:2019-08-19 09:00:45

标签: pandas dataframe

从DataFrame second_df

import pandas as pd

second_df = pd.DataFrame([[1, 1], [2, 2], [3, 3]], columns=['a', 'c'])
second_df

    a   c
0   1   1
1   2   2
2   3   3

我建立了一个系列second_s

second_s = second_df.iloc[0]
second_s

a    1
c    1
Name: 0, dtype: int64

当我从DataFrame first_df中减去该系列时

first_df = pd.DataFrame([[0.0, 0.1], [1.0, 1.1], [2.0, 2.1]], columns=['a', 'b'])
first_df

    a       b
0   0.0     0.1
1   1.0     1.1
2   2.0     2.1

我明白了

first_df.sub(second_s)

    a       b       c
0   -1.0    NaN     NaN
1   0.0     NaN     NaN
2   1.0     NaN     NaN

但我想要

    a       b       c
0   -1.0    0.1     -1.0
1   0.0     1.1     -1.0
2   1.0     2.1     -1.0

在处理之前不知道“标识符”列abc。除了abc以外,还有很多列,在处理之前也不知道,但是仅根据它们在数据帧中的出现知道有关它们存在的信息。如何获得所需的东西?

2 个答案:

答案 0 :(得分:1)

想法是使用Index.union添加缺失值,然后通过Series.reindex用新的列名将缺失值添加到Series中,因此可以减去:

second_df = pd.DataFrame([[1, 1], [2, 2], [3, 3]], columns=['a', 'c'])

first_df = pd.DataFrame([[0.0, 0.1], [1.0, 1.1], [2.0, 2.1]], columns=['a', 'b'])

second_s = second_df.iloc[0]

df = first_df.reindex(columns=first_df.columns.union(second_df.columns), fill_value=0)
print (df)
     a    b  c
0  0.0  0.1  0
1  1.0  1.1  0
2  2.0  2.1  0

out = df.sub(second_s.reindex(df.columns, fill_value=0))
print (out)
     a    b  c
0 -1.0  0.1 -1
1  0.0  1.1 -1
2  1.0  2.1 -1

答案 1 :(得分:1)

IIUC我想我有你需要的东西


convert -quality 100 source.tif \( -clone 0 -resize 16% -scale 3840x2160! \) \( unsharp_mask.tif \) -composite result.tif

首先,找到需要添加到second_df = pd.DataFrame([[1, 1], [2, 2], [3, 3]], columns=['a', 'c']) second_df.iloc[0] first_df = pd.DataFrame([[0.0, 0.1], [1.0, 1.1], [2.0, 2.1]], columns=['a', 'b']) 的“新”列。然后只需选择first_df中存在的列并应用您最初建议的操作即可。

second_df

那么您将拥有

new_cols = list(set(second_df.columns) - set(first_df.columns))
first_df = first_df.reindex(columns=[*first_df.columns.tolist(), *new_cols], fill_value=0)
first_df[second_df.columns] = first_df[second_df.columns].sub(second_s)