使用列表中的索引值从大数据框中创建较小的数据框

时间:2019-12-11 13:22:38

标签: python pandas dataframe

我有一个列表

a = [15, 50 , 75]

使用上面的列表,我必须创建较小的数据帧,以从主数据帧中过滤出索引上的行(行数由列表定义)。

假设我的主要数据框是 df 我想要的数据帧是 df1(来自行索引0-15),df2(来自行索引15-65),df3(来自行索引65-125)

由于这只是三个,所以我可以在下面轻松地使用以下内容:

limit1 = a[0]
limit2 = a[1] + limit1
limit3 = a[2] + limit3

df1 = df.loc[df.index <= limit1]
df2 = df.loc[(df.index > limit1) & (df.index <= limit2)]
df2 = df2.reset_index(drop = True)
df3 =  df.loc[(df.index > limit2) & (df.index <= limit3)]
df3 = df3.reset_index(drop = True)

但是,如果我想在主数据帧 df 上使用一长串列表来实现此目的,我正在寻找类似以下内容的可迭代对象(无效):

df1 = df.loc[df.index <= limit1]
for i in range(2,3):
 for j in range(2,3):
  for k in range(2,3):
   df[i] =  df.loc[(df.index > limit[j]) & (df.index <= limit[k])]
   df[i] = df[i].reset_index(drop=True)
   print(df[i])

2 个答案:

答案 0 :(得分:2)

您可以通过从主数据帧构建数据帧来迭代地从数据帧末尾切出切片来修改代码。

created

另一种选择是使用列表表达式,如下所示:

dfs = [] # this list contains your partitioned dataframes
a = [15, 50 , 75]
for idx in a[::-1]:
    dfs.insert(0, df.iloc[idx:])
    df = df.iloc[:idx]
dfs.insert(0, df) # add the last remaining dataframe
print(dfs) 

答案 1 :(得分:1)

做到了。如果要存储多个变量并在以后调用它们,最好使用字典。以迭代方式创建变量是不明智的做法,因此请始终避免使用它。

df = pd.DataFrame(np.linspace(1,75,75), columns=['a'])
a = [15, 50 , 25]
d = {}

b = 0
for n,i in enumerate(a):
    d[f'df{n}'] = df.iloc[b:b+i]
    b+=i

输出:

enter image description here