[英]slicing pandas df based on repeated cycle values in a particular column
[英]Take chunks of data from pandas df based on repeated values ranges in a column
我想根据特定列中的重复值范围从 pandas dataframe 中获取 select 数据。 例如,我在下面有 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 中,我想通过从range_col
中选择范围1 2 3
来遍历数据块。 所以第一个块将是
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
ETC...
我怎样才能像这样迭代 df ?
你可以这样做:
for _, group in df.groupby(df['range_col'] - df.index, sort=False):
print(group)
print()
Output
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 的旧配方,请参见此处。
使用Series.cumsum
+ Series.min
(参见Detail of groups
)使用DataFrame.groupby
创建组:
groups=(df['range_col']==df['range_col'].min()).cumsum()
for i,group in df.groupby(groups):
print(group)
print('-'*20)
Output:
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
--------------------
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.