使用多个词典中的不同列进行减法

时间:2017-08-21 15:30:22

标签: python pandas dictionary

我有两个dicts,一个有三列(A),另一个有六列(B),我希望能够使用第一列中的值(索引对于两个1-4都是常量)和也是第二列(1-2000)中的值,用于指定第三列中用于减法的正确元素。第二个dict类似,第一列和第二列用于查找正确的行,但它是减法所需的该行第六列中的值。

A                                   B
1  1  260   541                     1  1  260   280   0.001  521.4
1  1  390   1195                    1  1  390   900   0.02   963.3
1  1  102   6                       1  1  102   2     0.01   4.8
2  1  65    12                      2  1  65    9     0.13   13.1
2  1  515   659                     2  1  515   356   0.002  532.2
2  1  354   1200                    2  1  354   1087  0.119  1502.3
3  1  1190  53                      3  1  1190  46    0.058  12.0
3  1  1985  3                       3  1  1985  1     0.006  1.02
3  1  457   192                     3  1  25    3     0.001  178.2
4  1  261   2084                    4  1  261   1792  0.196  100.7
4  1  12    0                       4  1  12    0     0.000  12.6
4  1  1756  30                      4  1  1756  28    0.006  23.7
4  1  592   354                     4  1  592   291   0.357  251.9

所以基本上我想从A的最后一栏中减去B的最后一列,同时保留第一和第二列中的信息。

C         (desired output)                       
1  1  260   19.6
1  1  390   231.7
1  1  102   1.2
2  1  65    -1.1
2  1  515   126.8
2  1  354   -302.3
3  1  1190  41.0
3  1  1985  1.98
3  1  457   13.8
4  1  261   1983.3
4  1  12    -12.6
4  1  1756  6.3
4  1  592   102.1

我已经花了几个小时寻找解决方案,但还没有找到解决方案,但我确信它一定是可能的。 我需要能够在之后创建散点图,以防任何人对如何绘制正值并忽略负面值有任何建议。

编辑: 我在下面添加了我的代码以使其更清晰,我接收了三列csv文件,然后需要获得第三列中每个值的频率计数,当它们在第一列中具有相同的值时。 B然后进一步改变以获得所需的数据流,然后需要进行减法。在一些评论中,它提到第一列和第二列是不必要的,但第三列中的值与第一列中的值相关联,因此必须始终保持在同一行中。     将pandas导入为pd     导入numpy为np

def ba(fn, float1, float2):
    ba=pd.read_csv(fn,header=None, skipfooter=6, engine='python')
    ba['col4']=ba.groupby(['col1','col3']).transform(np.size)
    ba['col5']=ba['col4'].apply(lambda x: x/float(float2)) 
    ba['col6']=ba['col5'].apply(lambda x: x*float1)
    ba=ba.set_index('col1')
    ba = dict(tuple(ba.groupby('col1')))
    return ba

1 个答案:

答案 0 :(得分:0)

IIUIC,AB是数据框,然后

In [1062]: A.iloc[:, :3].assign(output=A.iloc[:, -1] - B.iloc[:, -1])
Out[1062]:
    0  1     2   output
0   1  1   260    19.60
1   1  1   390   231.70
2   1  1   102     1.20
3   2  1    65    -1.10
4   2  1   515   126.80
5   2  1   354  -302.30
6   3  1  1190    41.00
7   3  1  1985     1.98
8   3  1   457    13.80
9   4  1   261  1983.30
10  4  1    12   -12.60
11  4  1  1756     6.30
12  4  1   592   102.10

详细

In [1063]: A
Out[1063]:
    0  1     2     3
0   1  1   260   541
1   1  1   390  1195
2   1  1   102     6
3   2  1    65    12
4   2  1   515   659
5   2  1   354  1200
6   3  1  1190    53
7   3  1  1985     3
8   3  1   457   192
9   4  1   261  2084
10  4  1    12     0
11  4  1  1756    30
12  4  1   592   354

In [1064]: B
Out[1064]:
    0  1     2     3      4        5
0   1  1   260   280  0.001   521.40
1   1  1   390   900  0.020   963.30
2   1  1   102     2  0.010     4.80
3   2  1    65     9  0.130    13.10
4   2  1   515   356  0.002   532.20
5   2  1   354  1087  0.119  1502.30
6   3  1  1190    46  0.058    12.00
7   3  1  1985     1  0.006     1.02
8   3  1    25     3  0.001   178.20
9   4  1   261  1792  0.196   100.70
10  4  1    12     0  0.000    12.60
11  4  1  1756    28  0.006    23.70
12  4  1   592   291  0.357   251.90