减去熊猫中的一批列

时间:2018-11-20 22:27:18

标签: python pandas numpy

我正在过渡到使用熊猫来处理我的csv数据集。我目前正在尝试在熊猫中做我已经很容易在numpy中做的事情:从另一组中减去一组列几次。这实际上是逐元素矩阵减法。

仅供参考,这曾经是我为此的numpy解决方案

def subtract_baseline(data, baseline_columns, features_columns):
    """Takes in a list of baseline columns and feature columns, and subtracts the baseline values from all features"""
    assert len(features_columns)%len(baseline_columns)==0, "The number of feature columns is not divisible by baseline columns"
    num_blocks = len(features_columns)/len(baseline_columns)    
    block_size = len(baseline_columns)                         
    for i in range(num_blocks):
        #Grab each feature block and subract the baseline
        init_col = block_size*i+features_columns[0]
        final_col = init_col+block_size
        data[:, init_col:final_col] = numpy.subtract(data[:, init_col:final_col], data[:,baseline_columns])
    return data 

为了更好地说明,我们可以创建以下玩具数据集:

data = [[10,11,12,13,1,10],[20,21,22,23,1,10],[30,31,32,33,1,10],[40,41,42,43,1,10],[50,51,52,53,1,10],[60,61,62,63,1,10]]
df = pd.DataFrame(data,columns=['L1P1','L1P2','L2P1','L2P2','BP1','BP2'],dtype=float)

   L1P1  L1P2  L2P1  L2P2   BP1   BP2
0  10.0  11.0  12.0  13.0   1.0  10.0
1  20.0  21.0  22.0  23.0   1.0  10.0
2  30.0  31.0  32.0  33.0   1.0  10.0
3  40.0  41.0  42.0  43.0   1.0  10.0
4  50.0  51.0  52.0  53.0   1.0  10.0
5  60.0  61.0  62.0  63.0   1.0  10.0

正确的输出将是获取L1P1和L1P2中的值并减去G1P1和G1P2(又称为基准)的结果,然后再次对L2P1,L2P2和可能存在的任何其他列进行此操作(这就是我的目的循环执行原始功能)。

   L1P1  L1P2  L2P1  L2P2   BP1   BP2
0   9.0   1.0  11.0   3.0   1.0  10.0
1  19.0  11.0  21.0  13.0   1.0  10.0
2  29.0  21.0  31.0  23.0   1.0  10.0
3  39.0  31.0  41.0  33.0   1.0  10.0
4  49.0  41.0  51.0  43.0   1.0  10.0
5  59.0  51.0  61.0  53.0   1.0  10.0

请注意,数据框的标签不应更改,理想情况下,我希望使用一种依赖于列索引而不是标签的方法,因为实际数据块为30列,而不是本例中的2列。这就是我在numpy中使用原始函数的方式,参数baseline_columns和features_columns只是列索引的列表。

此后,基线列将从数据框中全部删除,因为它们的功能已经完成。

我尝试使用iloc仅进行了1批处理,但是得到了Nan值

df.iloc[:,[0,1]] = df.iloc[:,[0,1]] - df.iloc[:,[4,5]]

   L1P1  L1P2  L2P1  L2P2  G1P1  G1P2
0   NaN   NaN  12.0  13.0   1.0  10.0
1   NaN   NaN  22.0  23.0   1.0  10.0
2   NaN   NaN  32.0  33.0   1.0  10.0
3   NaN   NaN  42.0  43.0   1.0  10.0
4   NaN   NaN  52.0  53.0   1.0  10.0
5   NaN   NaN  62.0  63.0   1.0  10.0

2 个答案:

答案 0 :(得分:0)

您是否有理由要一行完成?即用两行代码可以达到目的吗?

df.iloc[:,0] = df.iloc[:,0] - df.iloc[:,4]
df.iloc[:,1] = df.iloc[:,1] - df.iloc[:,5]

这两行符合我的意图。

答案 1 :(得分:0)

在末尾添加.values,pandas数据框将搜索列和索引匹配以进行减法,因为该列与0,1和4,5不匹配,它将返回NaN

df.iloc[:,[0,1]]=df.iloc[:,[0,1]].values - df.iloc[:,[4,5]].values
df
Out[176]: 
   L1P1  L1P2  L2P1  L2P2  BP1   BP2
0   9.0   1.0  12.0  13.0  1.0  10.0
1  19.0  11.0  22.0  23.0  1.0  10.0
2  29.0  21.0  32.0  33.0  1.0  10.0
3  39.0  31.0  42.0  43.0  1.0  10.0
4  49.0  41.0  52.0  53.0  1.0  10.0
5  59.0  51.0  62.0  63.0  1.0  10.0