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
我有两个 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
df1.loc[:, df2.feature] /= df2.signals.values
Out[229]:
patient_id p1 p2 p3
0 ABC 0.043478 0.088889 0.026786