为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

至尊宝的传说 2022-06-22 17:21:11
目标:将 DataFrame A 的每一行转换为新的 Dataframe B。这个新的 Dataframe B 应该在每一行中包含一组来自 A 的列。如果有 6 个组,每个 B 中应该有 6 行。问题:我设法做到了上述事情,我只是想知道是否有更蟒蛇的方式来做到这一点?我已经尝试过尽可能简化,但我仍然觉得有一个更简单的解决方案。这是我的方法:import pandas as pdimport numpy as npA = 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_dataB = create_timeseries(A, slices)# have a look at first tranformed rowB[0]例子:输入(100 次观察):A:         A_1       B_1       B_20   0.574628  0.521426  0.1618651   0.137718  0.237061  0.1248902   0.753827  0.032432  0.7855843   0.611985  0.606326  0.5854084   0.676480  0.543213  0.055162..       ...       ...       ...95  0.383652  0.189211  0.22311096  0.063715  0.312059  0.23320697  0.886396  0.072423  0.10880998  0.853179  0.314846  0.90700699  0.302820  0.402470  0.152462[100 rows x 3 columns]输出(前 2 次观察):B[0]:        A_1       B_1       B_20  0.574628  0.000000  0.0000001  0.000000  0.521426  0.161865B[1]:        A_1       B_1      B_20  0.137718  0.000000  0.000001  0.000000  0.237061  0.12489
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

尝试这个:

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()



查看完整回答
反对 回复 2022-06-22
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

替代解决方案:


B = pd.DataFrame(data=np.repeat(A.values, 2, axis=0), columns=A.columns)

B.loc[1::2, 'A_1'] = 0

B.loc[::2 ,['B_1', 'B_2']] = 0

B = [B.iloc[i:i+2, :] for i in range(0, len(B), 2)]


查看完整回答
反对 回复 2022-06-22
  • 2 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信