【问题标题】:Create subsets in a loop according to a column values in pandas dataframe根据熊猫数据框中的列值在循环中创建子集
【发布时间】:2017-09-25 17:37:00
【问题描述】:

我有一个数据框,我不想根据一列的值在循环中创建子集。

这是一个例子 df :

c1        c2      c3
A          1       2
A          2       2
B          0       2
B          1       1

我想像这样循环创建子集

第一次迭代,选择 C1=A 的所有行,只选择第 2 列和第 3 列,第二次,选择 C1=B 的所有行,只选择 C2 和 3。

我尝试了以下代码:

for level in enumerate(df.loc[:,"C1"].unique()):

    df_s = df.loc[df["C1"]==level].iloc[:, 1:len(df.columns)]
    #other actions on the subsetted dataframe

但未执行子集。 如何遍历列的级别

例如在 R 中它会是

for (le in levels(df$C1){
dfs <- df[df$C1==le,2:ncol(df)]
}

谢谢

【问题讨论】:

    标签: python pandas loops subset levels


    【解决方案1】:

    不需要同时给出索引和值的enumerate,只需直接循环遍历c1 列:

    for level in df.c1.unique():
        df_s = df.loc[df.c1 == level].drop('c1', 1)
        print(level + ":\n", df_s)
    
    #A:
    #    c2  c3
    #0   1   2
    #1   2   2
    #B:
    #    c2  c3
    #2   0   2
    #3   1   1
    

    很可能,您需要的是df.groupby('c1').apply(lambda g: ...),这应该是一种更有效的方法;这里g 是具有唯一c1 值的子数据框。

    【讨论】:

      【解决方案2】:
      for level in df.loc[:,"c1"].unique():
          print(level)
          df_s = df.loc[df["c1"]==level,:].iloc[:,1:len(df)]
      
          print(df_s)
      
      A
         c2  c3
      0   1   2
      1   2   2
      B
         c2  c3
      2   0   2
      3   1   1
      

      或者(这个更像R)

      for level in df.loc[:,"c1"].unique():
          print(level)
          df_s = df.loc[df["c1"]==level,df.columns[1:len(df)]]
          print(df_s)
      

      【讨论】:

      • 我还在搜索如何在同一个调用中对行和列进行子集化,而不是在同一行代码中对我的 .loc 和 .iloc 进行子集化。
      • @Boidot 你可以查看 Psidom 的答案。
      猜你喜欢
      • 2015-09-12
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 2019-03-27
      • 2022-01-04
      • 2018-08-20
      • 2017-02-13
      • 2019-06-07
      相关资源
      最近更新 更多