划分两个pandas数据帧并保留非数字列

2024-04-18 13:14:15 发布

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

我有两个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只划分数字列?在


Tags: columns数据方法dataframepandasgroup数字result
3条回答

可以使用np.divide,将掩码传递给where参数。在

np.divide(b, a, where=a.dtypes.ne(object))

假设数据帧中的非数字列是相同的,请使用combine_first/fillna取回它们:

^{pr2}$

类似于@cᴏʟᴅsᴘᴇᴅ的答案,但是你可以用.select_dtypes()呆在熊猫体内。这将尝试对任何非对象数据类型执行索引对齐的除法。在

>>> b.select_dtypes(exclude='object').div(
...     a.select_dtypes(exclude='object')).combine_first(a)
...     
     A    B   Group
0  7.0  4.0  group1
1  3.0  2.5  group1
2  2.2  2.0  group1

要保留列顺序:

^{pr2}$

也许set_index()

b.set_index('Group').div(a.set_index('Group'),level=[0]).reset_index()
Out[579]: 
    Group    A    B
0  group1  7.0  4.0
1  group1  3.0  2.5
2  group1  2.2  2.0

为更多的字符串类型列工作

^{pr2}$

相关问题 更多 >