首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据连续索引拆分DataFrame?

如何根据连续索引拆分DataFrame?
EN

Stack Overflow用户
提问于 2019-05-22 12:56:02
回答 4查看 2K关注 0票数 8

我有一个非连续索引的DataFrame 'work‘,下面是一个例子:

代码语言:javascript
复制
Index Column1 Column2
4464  10.5    12.7
4465  11.3    12.8
4466  10.3    22.8
5123  11.3    21.8
5124  10.6    22.4
5323  18.6    23.5

我需要从这个只包含索引连续的行的DataFrame新DataFrames中提取,所以在本例中,我的目标是

代码语言:javascript
复制
DF_1.index=[4464,4465,4466]
DF_2.index=[5123,5124]
DF_3.index=[5323]

维护所有的列。

有谁可以帮我?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-05-22 14:28:08

groupby

您可以使用

代码语言:javascript
复制
np.arange(10)

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

如果我从单调递增的索引中减去这个值,那么只有那些“连续”的索引成员才会显示为相等。这是建立分组密钥的一种聪明方法。

代码语言:javascript
复制
list_of_df = [d for _, d in df.groupby(df.index - np.arange(len(df)))]

然后打印每一张来证明

代码语言:javascript
复制
print(*list_of_df, sep='\n\n')

       Column1  Column2
Index                  
4464      10.5     12.7
4465      11.3     12.8
4466      10.3     22.8

       Column1  Column2
Index                  
5123      11.3     21.8
5124      10.6     22.4

       Column1  Column2
Index                  
5323      18.6     23.5

np.split

您可以使用np.flatnonzero来确定哪些地方的差异不等于1,并避免使用cumsumgroupby

代码语言:javascript
复制
list_of_df = np.split(df, np.flatnonzero(np.diff(df.index) != 1) + 1)

证明

代码语言:javascript
复制
print(*list_of_df, sep='\n\n')

       Column1  Column2
Index                  
4464      10.5     12.7
4465      11.3     12.8
4466      10.3     22.8

       Column1  Column2
Index                  
5123      11.3     21.8
5124      10.6     22.4

       Column1  Column2
Index                  
5323      18.6     23.5
票数 11
EN

Stack Overflow用户

发布于 2019-05-22 13:29:00

以下是另一种选择:

代码语言:javascript
复制
grouper = (~(pd.Series(df.index).diff() == 1)).cumsum().values  
dfs = [dfx for _ , dfx in df.groupby(grouper)]

我们利用这样一个事实:1的连续差分等于一个序列(diff == 1)。

完整的例子:

代码语言:javascript
复制
import pandas as pd

data = '''\
Index Column1 Column2
4464  10.5    12.7
4465  11.3    12.8
4466  10.3    22.8
5123  11.3    21.8
5124  10.6    22.4
5323  18.6    23.5
'''

fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj, sep='\s+', index_col='Index')

non_sequence = pd.Series(df.index).diff() != 1
grouper = non_sequence.cumsum().values
dfs = [dfx for _ , dfx in df.groupby(grouper)]

print(dfs[0])

#       Column1  Column2
#Index                  
#4464      10.5     12.7
#4465      11.3     12.8
#4466      10.3     22.8

另一种看法是,我们寻找非序列的群,可能更易读:

代码语言:javascript
复制
non_sequence = pd.Series(df.index).diff() != 1
grouper = non_sequence.cumsum().values
dfs = [dfx for _ , dfx in df.groupby(grouper)]
票数 5
EN

Stack Overflow用户

发布于 2019-05-22 13:17:04

也许有一种更优雅的方式来记录它,但下面是对我有用的方法:

代码语言:javascript
复制
previous_index = df.index[0]
groups = {}
for x in df.index:
    if (x-previous_index) ==1 : 
        groups[max(groups.keys())].append(x)
    else:
        groups[len(groups.keys())]=[x]
    previous_index = x

output_dfs = []
for key, val in groups.items():
    print(key, val)
    output_dfs.append(df[df.index.isin(val)])

您的数据将存储在output_dfs

代码语言:javascript
复制
output_dfs[0].index

4464,4465,4466

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56257329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档