我想基于特定列中值的重复范围从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?
答案 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
--------------------