我有一个非连续索引的DataFrame 'work‘,下面是一个例子:
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中提取,所以在本例中,我的目标是
DF_1.index=[4464,4465,4466]
DF_2.index=[5123,5124]
DF_3.index=[5323]维护所有的列。
有谁可以帮我?
发布于 2019-05-22 14:28:08
groupby
您可以使用
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])如果我从单调递增的索引中减去这个值,那么只有那些“连续”的索引成员才会显示为相等。这是建立分组密钥的一种聪明方法。
list_of_df = [d for _, d in df.groupby(df.index - np.arange(len(df)))]然后打印每一张来证明
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.5np.split
您可以使用np.flatnonzero来确定哪些地方的差异不等于1,并避免使用cumsum和groupby。
list_of_df = np.split(df, np.flatnonzero(np.diff(df.index) != 1) + 1)证明
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发布于 2019-05-22 13:29:00
以下是另一种选择:
grouper = (~(pd.Series(df.index).diff() == 1)).cumsum().values
dfs = [dfx for _ , dfx in df.groupby(grouper)]我们利用这样一个事实:1的连续差分等于一个序列(diff == 1)。
完整的例子:
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另一种看法是,我们寻找非序列的群,可能更易读:
non_sequence = pd.Series(df.index).diff() != 1
grouper = non_sequence.cumsum().values
dfs = [dfx for _ , dfx in df.groupby(grouper)]发布于 2019-05-22 13:17:04
也许有一种更优雅的方式来记录它,但下面是对我有用的方法:
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中
output_dfs[0].index4464,4465,4466
https://stackoverflow.com/questions/56257329
复制相似问题