【问题标题】:create DataFrame from each row of another DataFrame in grouped columns?从分组列中另一个 DataFrame 的每一行创建 DataFrame?
【发布时间】:2020-02-11 07:18:54
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您可以添加示例输入和预期输出,目标就会变得清晰。
  • @Parth 它已经包含在上面的代码中,A 作为输入,B[0] 作为预期输出,但我可能会添加视觉支持
  • 好的,但是用例子说明清楚,基于什么逻辑,输出是从输入创建的?从代码中理解是不对的。
  • 是的,你是对的,我添加了一个示例。问题是,上面的代码解决了我只是好奇是否有更好的方法来做同样的事情
  • 检查答案,看看它是否符合您的要求。

标签: python pandas dataframe time-series slice


【解决方案1】:

试试这个:

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

【讨论】:

  • 不错的解决方案,但数据帧的标头丢失了。不过很容易修复: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()
  • 感谢你们的建议,我也会检查如何将其添加到我的函数中!
  • 哪种方法最适合您的需求,请考虑接受答案。
【解决方案2】:

替代解决方案:

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

【讨论】:

  • 感谢您的输入,我将尝试将此方法添加到我的函数中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2020-10-28
  • 2020-10-15
  • 2015-12-05
  • 2016-03-05
  • 2021-05-02
相关资源
最近更新 更多