pandas 数据框之间的点划分忽略其中一个的第一列

Dot division between pandas dataframe ignoring first column of one of them

我有两个 pandas 数据帧如下:

df1_input = {'patient_id': [ABC], 'p1': [1], 'p2': [4], 'p3': [3]}
df1 = pd.DataFrame(df1_input, columns=['patient_id', 'p1', 'p2', 'p3'])

df1 看起来像:

patient_id   p1   p2   p3
    ABC      1    4    3

df2_input = {'feature': [p1, p2, p3], 'signals': [23, 45, 112]}
df2 = pd.DataFrame(df2_input, columns=['feature', 'signals']

df2 看起来像:

feature   signals
   p1       23
   p2       45
   p3       112

我想将 df1 中的每个数字除以 df2 中相应的特征,然后再次 return df1。像这样:

patient_id   p1     p2      p3
   ABC      1/23   4/45    3/112

我试过:

final = pd.DataFrame(df1.values / df2.values, index=df1.index, columns=df2.index)

但我得到:

ValueError: operands could not be broadcast together with shapes (1,4) (3,2) 

问题是:我无法删除 patient_id 列!否则,我不会认出每个数字属于哪里。有任何想法吗?谢谢!

也许您可以尝试设置索引?这也适用于多个 features/signals。

df1.set_index('patient_id', inplace=True)
df2.set_index('feature', inplace=True)

df1

            p1  p2  p3
patient_id          
    ABC     1   4   3

df2

        signals
feature 
p1      23
p2      45
p3      112

然后:

final = pd.DataFrame(df1.values / df2['signals'].values, index=df1.index, 
columns=df2.index)

甚至更好,就像在 Jezraels div:

final = df1.div(df2['signals'])

决赛

 feature        p1          p2          p3
 patient_id         
 ABC            0.043478    0.088889    0.026786
temp_df1 = df1.T.reset_index().rename({'index':'feature'},axis=1)
##temp_df1

      feature    0
0  patient_id  ABC
1          p1    1
2          p2    4
3          p3    3

temp_df1.merge(df2, how='outer').set_index('feature').apply(lambda x: x[0]/x['signals'] if str(x['signals']) !='nan' else x,axis=1).drop('signals',axis=1).T

输出

feature patient_id         p1         p2         p3
0              ABC  0.0434783  0.0888889  0.0267857

使用 DataFrame.set_index with DataFrame.div 将列名称与 feature 列值对齐:

df2 = df1.set_index('patient_id').div(df2.set_index('feature')['signals']).reset_index()
print (df2)
  patient_id        p1        p2        p3
0        ABC  0.043478  0.088889  0.026786

在具有 df2.feature 列的 df1 上使用 loc 并使用 df2.signals

的 ndarray 进行内联除法
df1.loc[:, df2.feature] /= df2.signals.values

Out[229]:
  patient_id        p1        p2        p3
0        ABC  0.043478  0.088889  0.026786