【问题标题】:Create smaller dataframes from a large dataframe using the index values from a list使用列表中的索引值从大型数据帧创建较小的数据帧
【发布时间】:2020-04-04 19:03:01
【问题描述】:

我有一个清单

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

【问题讨论】:

  • 根据您的逻辑,它应该是从 0-15 开始,然后从 15-65 开始,然后从 65-90 开始,否则您的规则正在改变
  • 是的。没错
  • 检查我的答案

标签: python pandas dataframe


【解决方案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)]

【讨论】:

  • 在 75 行数据帧上,这会带来 60 行 df,然后是 10 行 df,然后是 0 行 df
  • 现在它带来了 35 行、25 行和 0 行 df
  • 0 到 15 丢失。我会设置:a = [0, 15, 50 , 75]
  • 真的。在末尾添加 dfs.insert(0, df) 即可解决。
  • 整洁。谢谢:)
【解决方案2】:

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

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

输出:

【讨论】:

    猜你喜欢
    • 2020-06-29
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多