我有一个数据框,比如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中的对应值。
答案 0 :(得分:4)
您可以将div
与DataFrames
的{{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)