2017-09-25 122 views
0

我有一個數據幀,我不想根據一列的值在循環中創建子集。根據熊貓數據幀中的列值在循環中創建子集

下面是一個例子DF:

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

我想在一個循環中以創建子集,像這樣

一次迭代中,選擇所有的行,其中C1 = A,並且只有列2和3第二,其中C1 = B,只有C 2和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 

但該子集未被執行。 如何迭代throudh列的水平

例如R中這將是

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

感謝

回答

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值的子數據幀。

0
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) 
+0

我如何子集相同的呼叫,而不是我的.loc和.iloc在同一行的行和列也搜索碼。 – Boidot

+0

@Boidot你可以檢查Psidom的答案。 – Wen