python-3.x 按另一个DataFrame划分DataFrame组

ehxuflar  于 2023-06-25  发布在  Python
关注(0)|答案(3)|浏览(133)

下面有一个DataFrameas:

Tester = pd.DataFrame({'Col1': ['A', 'A', 'B', 'B'],
                       'Col2': [1, 1, 2, 2],
                       'Col3': [1, 1, 2, 2],
                       'Col4': [1, 1, 2, 2],
                       'Col5': [1, 1, 2, 2]})

我想按Col1对DataFrame进行分组,然后按一个大小相等的包含标量的DataFrame划分分组:

Divider = pd.DataFrame({'Col2': [2, 2],
                       'Col3': [2, 2],
                       'Col4': [2, 2],
                       'Col5': [2, 2]})

在我看来,它的工作原理是这样的:

df = Tester.groupby('Col1').div(Divider)

但这将返回一个错误。有什么想法可以做到这一点吗?我希望得到以下输出DataFrame:

output = pd.DataFrame({'Col1': ['A', 'A', 'B', 'B'],
                       'Col2': [0.5, 0.5, 1, 1],
                       'Col3': [0.5, 0.5, 1, 1],
                       'Col4': [0.5, 0.5, 1, 1],
                       'Col5': [0.5, 0.5, 1, 1]})

注意每组AB等将具有与分隔DataFrame Divider相同的维度(在本例中为2x4)

r6l8ljro

r6l8ljro1#

IIUC,您可以使用groupby.apply,并将每个组除以除法器作为numpy数组:

cols = Divider.columns
div = Divider.to_numpy()

Tester[cols] = Tester.groupby('Col1')[cols].apply(lambda g: g/div)

或者使用numpy和**,假设组已排序**:

cols = Divider.columns

Tester[cols] /= np.repeat(Divider.to_numpy(), Tester['Col1'].nunique(), axis=0)

如果组未排序:

cols = Divider.columns

Tester[cols] = (Tester.sort_values(by='Col1')[cols]
                / np.repeat(Divider.to_numpy(), Tester['Col1'].nunique(), axis=0)
               )

输出:

Col1  Col2  Col3  Col4  Col5
0    A   0.5   0.5   0.5   0.5
1    A   0.5   0.5   0.5   0.5
2    B   1.0   1.0   1.0   1.0
3    B   1.0   1.0   1.0   1.0
mzmfm0qo

mzmfm0qo2#

下面是使用cumcount()的选项

df.set_index([df.groupby('Col1').cumcount(),'Col1']).div(df2,level=0).reset_index(level=1)

输出:

Col1  Col2  Col3  Col4  Col5
0    A   0.5   0.5   0.5   0.5
1    A   0.5   0.5   0.5   0.5
0    B   1.0   1.0   1.0   1.0
1    B   1.0   1.0   1.0   1.0
shyt4zoc

shyt4zoc3#

你也可以这样做:

import pandas as pd
import numpy as np

Tester = pd.DataFrame({'Col1': ['A', 'A', 'B', 'B'],
                       'Col2': [1, 1, 2, 2],
                       'Col3': [1, 1, 2, 2],
                       'Col4': [1, 1, 2, 2],
                       'Col5': [1, 1, 2, 2]})

Divider = pd.DataFrame({'Col2': [2, 2],
                        'Col3': [2, 2],
                        'Col4': [2, 2],
                        'Col5': [2, 2]})

divider_repeated = np.repeat(Divider.values, Tester.groupby('Col1').size(), axis=0)

output = Tester.drop('Col1', axis=1) / divider_repeated

output['Col1'] = Tester['Col1'].values

print(output)

产出将是:

Col2  Col3  Col4  Col5 Col1
0   0.5   0.5   0.5   0.5    A
1   0.5   0.5   0.5   0.5    A
2   1.0   1.0   1.0   1.0    B
3   1.0   1.0   1.0   1.0    B

相关问题