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

Python 使用列表中的索引值从大型数据帧创建较小的数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有一张单子 a = [15, 50 , 75] 使用上面的列表,我必须创建更小的数据帧,过滤掉行。行数由主数据帧索引上的列表定义 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 las

我有一张单子

a = [15, 50 , 75]
使用上面的列表,我必须创建更小的数据帧,过滤掉行。行数由主数据帧索引上的列表定义

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) 
假设我的主数据帧是df 我想要的数据帧是来自行索引0-15的df1,来自行索引15-65的df2,来自行索引65-125的df3

因为这仅仅是三个,所以我可以很容易地使用如下内容:

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

您可以通过从主数据帧构建数据帧来修改代码,从数据帧的末尾迭代地剪切片段

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) 
另一个选项是使用列表表达式,如下所示:

a = [0, 15, 50 , 75]
dfs = [df.iloc[a[i]:a[i+1]] for i in range(len(a)-1)]

您可以通过从主数据帧构建数据帧来修改代码,从数据帧的末尾迭代地剪切片段

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) 
另一个选项是使用列表表达式,如下所示:

a = [0, 15, 50 , 75]
dfs = [df.iloc[a[i]:a[i+1]] for i in range(len(a)-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
输出:


就这样。如果要存储多个变量并在以后调用它们,最好使用字典。以迭代的方式创建变量是一种不好的做法,所以一定要避免它

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
输出:


根据你的逻辑,应该是0-15,然后是15-65,然后是65-90,否则你的规则会改变是的。那是正确的根据你的逻辑检查我的回答应该是0-15,然后是15-65,然后是65-90,否则你的规则会改变是的。这是正确的检查我的回答在一个75行数据帧上这带来了一个60行df,然后是10行df,然后是0行df现在它带来了一个35行,一个25行和一个0行df0到15缺失。我会设置:a=[0,15,50,75]为真。在末尾添加dfs.insert0和df可以解决它。谢谢:在75行数据帧上,这会产生60行df,然后是10行df,然后是0行df。现在,它会产生35行、25行和0行df0到15。我会设置:a=[0,15,50,75]为真。在末尾添加dfs.insert0和df可以解决它。谢谢: