如何将一个数据帧中一个类别的多个值与另一个数据帧中同一类别对应的单个值分开

2024-04-27 00:40:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,比如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中。数据2的格式为。你知道吗

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

请注意,我们在两个数据帧中有相同的列。数据1包含一个类别的多行,但数据2只包含每个类别的一行。你知道吗

结果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中相应的值所除。你知道吗


Tags: 数据类型data格式类别data1data2data3
2条回答

可以将^{}DataFrames^{}一起使用:

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

假设data2形成data1中存在的值的子集,可以使用^{}和left join来保持顺序,同时对它们进行分组和分割。你知道吗

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

相关问题 更多 >