从分组列中另一个 DataFrame 的每一行创建 DataFrame?

目标:将 DataFrame A 的每一行转换为新的 Dataframe B。这个新的 Dataframe B 应该在每一行中包含一组来自 A 的列。如果有 6 个组,每个 B 中应该有 6 行。


问题:我设法做到了上述事情,我只是想知道是否有更蟒蛇的方式来做到这一点?我已经尝试过尽可能简化,但我仍然觉得有一个更简单的解决方案。这是我的方法:


import pandas as pd

import numpy as np


A = pd.DataFrame(np.random.rand(100,3), columns=['A_1','B_1','B_2'])

slices = [['A_1','A_2'],['B_1','B_2']]


def create_timeseries(data, slices):

    sliced_cols = [list(data.columns[data.columns.isin(i)]) for i in slices]

    len_slices = [0] + [len(sliced_cols[i]) for i in range(len(sliced_cols))]

    len_slices = np.cumsum(len_slices) 

    final_sliced_data = []

    for i, rows in enumerate(data.iterrows()):

        mat = np.zeros((len(sliced_cols), len_slices[-1]))

        for j, slices in enumerate(sliced_cols):

            mat[j, len_slices[j]:len_slices[j+1]] = rows[1].loc[slices]

        final_sliced_data.append(pd.DataFrame(mat, columns=sum(sliced_cols, [])))

    return final_sliced_data


B = create_timeseries(A, slices)


# have a look at first tranformed row

B[0]

例子:


输入(100 次观察):


A:

         A_1       B_1       B_2

0   0.574628  0.521426  0.161865

1   0.137718  0.237061  0.124890

2   0.753827  0.032432  0.785584

3   0.611985  0.606326  0.585408

4   0.676480  0.543213  0.055162

..       ...       ...       ...

95  0.383652  0.189211  0.223110

96  0.063715  0.312059  0.233206

97  0.886396  0.072423  0.108809

98  0.853179  0.314846  0.907006

99  0.302820  0.402470  0.152462


[100 rows x 3 columns]

输出(前 2 次观察):


B[0]:

        A_1       B_1       B_2

0  0.574628  0.000000  0.000000

1  0.000000  0.521426  0.161865


B[1]:

        A_1       B_1      B_2

0  0.137718  0.000000  0.00000

1  0.000000  0.237061  0.12489


至尊宝的传说
浏览 130回答 2
2回答

Cats萌萌

尝试这个:B = A.apply(lambda x: pd.DataFrame([[x.A_1,0,0],[0, x.B_1, x.B_2]], columns=A.columns), axis=1).tolist()

犯罪嫌疑人X

替代解决方案:B = pd.DataFrame(data=np.repeat(A.values, 2, axis=0), columns=A.columns)B.loc[1::2, 'A_1'] = 0B.loc[::2 ,['B_1', 'B_2']] = 0B = [B.iloc[i:i+2, :] for i in range(0, len(B), 2)]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python