如何将数据框中一个类别的多个值与另一个数据框中相同类别的相应单个值进行划分

时间:2016-11-30 09:15:32

标签: python python-2.7 pandas

我有一个数据框,比如data1。它的第一列包含类别类型(比如A,B,C)。

data1 = [["A", 5, 6], ["B", 7, 3], ["C", 9, 6], ["B", 2, 8], ["A", 4, 8], ["C", 8, 1], ["B", 1, 0]]

现在我想将data1中一个类别的每个值与data2中的相应值相除(或相乘或同时),并将其存储在data3中。 data2是形式。

data 2= [["A", 5, 8], ["B", 7, 8], ["C", 9, 6]]

请注意,我们在两个数据框中都有相同的列。 data1包含一个类别的多行,但data2仅包含每个类别的一行。

在结果中,data3将包含这样的值

data1 = [["A", 5/5, 6/8], ["B", 7/7, 3/8], ["C", 9/9, 6/6], ["B", 2/7, 8/8], ["A", 4/5, 8/8], ["C", 8/9, 1/6], ["B", 1/7, 0/8]]

这里5/5表示结果值,即1.我用这种方式编写它只是为了表明data1中的每个值除以data2中的对应值。

2 个答案:

答案 0 :(得分:4)

您可以将divDataFrames的{​​{3}}一起使用:

data1 = [["A", 5, 6], ["B", 7, 3], ["C", 9, 6], 
         ["B", 2, 8], ["A", 4, 8], ["C", 8, 1], ["B", 1, 0]]
data1 = pd.DataFrame(data1)
print (data1)
   0  1  2
0  A  5  6
1  B  7  3
2  C  9  6
3  B  2  8
4  A  4  8
5  C  8  1
6  B  1  0

data2= [["A", 5, 8], ["B", 7, 8], ["C", 9, 6]]
data2 = pd.DataFrame(data2)
print (data2)
   0  1  2
0  A  5  8
1  B  7  8
2  C  9  6
print (data1.set_index(0).div(data2.set_index(0)).reset_index())
   0         1         2
0  A  1.000000  0.750000
1  A  0.800000  1.000000
2  B  1.000000  0.375000
3  B  0.285714  1.000000
4  B  0.142857  0.000000
5  C  1.000000  1.000000
6  C  0.888889  0.166667

如果第二个DataFrame中缺少第一列的某些值,请获取NaN,因此需要参数fill_value=1

data1 = [["A", 5, 6], ["B", 7, 3], ["C", 9, 6],
         ["B", 2, 8], ["A", 4, 8], ["C", 8, 1], ["B", 1, 0]]
data1 = pd.DataFrame(data1)
print (data1)
   0  1  2
0  A  5  6
1  B  7  3
2  C  9  6
3  B  2  8
4  A  4  8
5  C  8  1
6  B  1  0

data2= [["A", 5, 8], ["B", 7, 8]]
data2 = pd.DataFrame(data2)
print (data2)
   0  1  2
0  A  5  8
1  B  7  8
print (data1.set_index(0).div(data2.set_index(0)).reset_index())
   0         1      2
0  A  1.000000  0.750
1  A  0.800000  1.000
2  B  1.000000  0.375
3  B  0.285714  1.000
4  B  0.142857  0.000
5  C       NaN    NaN
6  C       NaN    NaN

print (data1.set_index(0).div(data2.set_index(0), fill_value=1).reset_index())
   0         1      2
0  A  1.000000  0.750
1  A  0.800000  1.000
2  B  1.000000  0.375
3  B  0.285714  1.000
4  B  0.142857  0.000
5  C  9.000000  6.000
6  C  8.000000  1.000

答案 1 :(得分:1)

假设 data2 形成 data1 中存在的值的子集,您可以使用merge和左连接来保留订单,同时对其进行分组和划分

res_df = df1.merge(df2, on=[0], how='left')
a = np.column_stack((res_df.iloc[:,0], res_df.iloc[:,1:3].values/res_df.iloc[:,3:].values))
pd.DataFrame(a)

enter image description here