按行拆分数据框并在python中生成数据框列表

时间:2019-10-03 09:18:35

标签: python pandas list dataframe

我有一个数据框:

data = {'Timestep'      : [0,1,2,0,1,2,3,0,1],
        'Price'           : [5,7,3,5,7,10,8,4,8],
        'Time Remaining' : [10.0,10.0,10.0,15.0,15.0,15.0,15.0,12.0,12.0]}
df = pd.DataFrame(data, columns = ['Timestep','Price','Time Remaining'])

Dataframe

我想将数据帧转换为包含多个数据帧的列表,其中每个时间步序列(0-2,0-3,0-1)是一个数据帧。此外,我希望时间步长成为每个数据集中的索引。最后应该看起来像这样:

list with multiple dataframes

我有一个包含数千行和不规则序列的数据框,所以我想我必须遍历行。

有人知道我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

据我了解-每当Timestep达到0时,您都需要一个新的DataFrame-

这是您可以尝试的

#This will give you the location of all zeros [0, 3, 7]
zero_indices = list(df.loc[df.Timestep == 0].index)
#We append the number of rows to this to get the last dataframe [0, 3, 7, 9]
zero_indices.append(len(df))
#Then we get the ranges - tuples of consecutive entries in the above list [(0, 3), (3, 7), (7, 9)]
zero_ranges = [(zero_indices[i], zero_indices[i+1]) for i in range(len(zero_indices) - 1)]
#And then we extract the dataframes into a list
list_of_dfs = [df.loc[x[0]:x[1] - 1].copy(deep=True) for x in zero_ranges]

答案 1 :(得分:0)

现在在移动设备上无法测试,但是您可以通过以下操作来完成此操作:

current_sequence_index = -1
sequences = []
for __, row in data.iterrows():
    if row.Timestep == 0:
        sequences.append(pd.DataFrame())
        current_sequence_index += 1

    sequences[current_sequence_index].append(row, ignore_index=True)   

基本上,这将遍历您的数据并在Timestep为0时生成一个新的DataFrame。此解决方案有一些假设: 1. Timestep的开始始终为0。 2.时间步长总是顺序的。