根据 pandas 数据框中的列值在循环中创建子集

Create subsets in a loop according to a column values in pandas dataframe

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

这里有一个例子 df :

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

我想像这样循环创建子集

第一次迭代,select 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)]
}

谢谢

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 值的子数据框。

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)