根据一列中的重复值范围从pandas df获取数据块

时间:2019-10-30 19:12:11

标签: python pandas

我想基于特定列中值的重复范围从pandas数据框中选择数据。例如,我在下面输入df。

range_col col1 col2
  1        a   b
  2        c   d
  3        e   f
  1        m   n
  2        o   p
  3        r   s
  1        e   f
  2        j   k
  3        l   m 

在df上方,我想通过从1 2 3中选择范围range_col来遍历数据块。所以第一块是

range_col col1 col2
  1        a   b
  2        c   d
  3        e   f

第二个将是

range_col col1 col2
  1        m   n
  2        o   p
  3        r   s

等...

如何像这样迭代df?

2 个答案:

答案 0 :(得分:1)

您可以这样做:

for _, group in df.groupby(df['range_col'] - df.index, sort=False):
    print(group)
    print()

输出

    range_col col1 col2
0          1    a    b
1          2    c    d
2          3    e    f

   range_col col1 col2
3          1    m    n
4          2    o    p
5          3    r    s

   range_col col1 col2
6          1    e    f
7          2    j    k
8          3    l    m

这是基于itertools的旧配方,请参见here

答案 1 :(得分:1)

使用Series.cumsum + Series.min(请参阅groups详细信息)使用DataFrame.groupby创建组:

groups=(df['range_col']==df['range_col'].min()).cumsum()
for i,group in df.groupby(groups):
    print(group)
    print('-'*20)

输出:

       range_col col1 col2
0          1    a    b
1          2    c    d
2          3    e    f
--------------------
   range_col col1 col2
3          1    m    n
4          2    o    p
5          3    r    s
--------------------
   range_col col1 col2
6          1    e    f
7          2    j    k
8          3    l    m
--------------------

详细信息:

print(groups)
0    1
1    1
2    1
3    2
4    2
5    2
6    3
7    3
8    3
Name: range_col, dtype: int64

您可以将数据框保存为字典:

groups=(df['range_col']==df['range_col'].min()).cumsum()
dfn={i:group for i,group in df.groupby(groups)}

for n in dfn:
    print(f'df[{n}]')
    print(dfn[n])
    print('-'*20)

df[1]
   range_col col1 col2
0          1    a    b
1          2    c    d
2          3    e    f
--------------------
df[2]
   range_col col1 col2
3          1    m    n
4          2    o    p
5          3    r    s
--------------------
df[3]
   range_col col1 col2
6          1    e    f
7          2    j    k
8          3    l    m
--------------------