Python 从分组列中另一个数据帧的每一行创建数据帧?
目标:将数据框a的每一行转换为新的数据框B。此新的数据框B应在每一行中包含来自a的一组列。如果有6组,则每个B中应有6行 问:我设法做到了以上几点,我只是想知道是否有一种更像蟒蛇的方式来做到这一点?我已经尽可能地简化了,但我觉得有一个更简单的解决方案。以下是我的方法:Python 从分组列中另一个数据帧的每一行创建数据帧?,python,pandas,dataframe,time-series,slice,Python,Pandas,Dataframe,Time Series,Slice,目标:将数据框a的每一行转换为新的数据框B。此新的数据框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
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]
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
输出前2个观察结果:
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]
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
试试这个:
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()
替代解决方案:
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)]
替代解决方案:
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)]
如果您可以添加示例输入和预期输出,目标将变得清晰。@Parth上面的代码中已经包含了作为输入的A和作为预期输出的B[0],但我可能会添加visual Support好的,但请用示例说明,基于什么逻辑,输出是从输入创建的?从代码中理解不是正确的做法。是的,你是对的,我添加了一个例子。问题是,上面的代码解决了这个问题。我只是好奇是否有更好的方法来做同样的事情。检查答案,看看它是否满足您的要求。如果您可以添加示例输入和预期输出,目标就会变得清晰。@Parth上面的代码中已经包含了a作为输入,B[0]作为预期输出,但我可能会添加视觉支持,好吧,但请用示例说明,基于什么逻辑,输出是从输入创建的?从代码中理解不是正确的做法。是的,你是对的,我添加了一个例子。问题是,上面的代码解决了这个问题。我只是好奇是否有更好的方法来做同样的事情。检查答案,看看它是否满足您的要求。不错的解决方案,但是数据帧的头丢失了。不过很容易修复:B=A.applylambda x:pd.DataFrame[[x.A_1,0,0],[0,x.B_1,x.B_2]],columns=A.columns,axis=1。谢谢你们的建议,我也会检查如何将其添加到我的函数中!无论哪种方法最适合你的需求,都要考虑接受一个好的解决方案,但是数据文件的头丢失了。不过很容易修复:B=A.applylambda x:pd.DataFrame[[x.A_1,0,0],[0,x.B_1,x.B_2]],columns=A.columns,axis=1。谢谢你们的建议,我也会检查如何将其添加到我的函数中!无论哪种方法最适合你的需求,考虑接受一个答案。感谢输入,我会尝试添加这个方法到我的功能。感谢输入。我会尝试把这个方法添加到我的函数中。