我有两个pandas数据帧,包含数值和非数值。我想把一个除以另一个,但保留非数字列。以下是MWE:
a = pd.DataFrame(
[
['group1', 1., 2.],
['group1', 3., 4.],
['group1', 5., 6.]
],
columns=['Group', 'A', 'B']
)
b = pd.DataFrame(
[
['group1', 7., 8.],
['group1', 9., 10.],
['group1', 11., 12.]
],
columns=['Group', 'A', 'B']
)
正在尝试:
^{pr2}$结果:
TypeError: unsupported operand type(s) for /: 'str' and 'str'
为了解决这个问题,我做了:
result = b.drop(["Group"], axis=1).div(a.drop(["Group"], axis=1))
print(result)
# A B
#0 7.0 4.0
#1 3.0 2.5
#2 2.2 2.0
这是正确的,但是我还想保留列"Group"
。在
获得我想要的输出的一种方法是:
desired_output = b[["Group"]].join(result)
print(desired_output)
# Group A B
#0 group1 7.0 4.0
#1 group1 3.0 2.5
#2 group1 2.2 2.0
但我真正的数据帧有很多非数字列。有没有更干净/更快/更有效的方法来告诉pandas只划分数字列?在
可以使用
np.divide
,将掩码传递给where
参数。在假设数据帧中的非数字列是相同的,请使用
^{pr2}$combine_first
/fillna
取回它们:类似于@cᴏʟᴅsᴘᴇᴅ的答案,但是你可以用
.select_dtypes()
呆在熊猫体内。这将尝试对任何非对象数据类型执行索引对齐的除法。在要保留列顺序:
^{pr2}$也许
set_index()
为更多的字符串类型列工作
^{pr2}$相关问题 更多 >
编程相关推荐