大熊猫 - 数据帧的切片剖面成多个dataframes
问题描述:
我有一个数据帧的熊猫与3000+行,看起来像这样:大熊猫 - 数据帧的切片剖面成多个dataframes
t090: c0S/m: pr: timeJ: potemp090C: sal00: depSM: \
407 19.3574 4.16649 1.836 189.617454 19.3571 30.3949 1.824
408 19.3519 4.47521 1.381 189.617512 19.3517 32.9250 1.372
409 19.3712 4.44736 0.710 189.617569 19.3711 32.6810 0.705
410 19.3602 4.26486 0.264 189.617627 19.3602 31.1949 0.262
411 19.3616 3.55025 0.084 189.617685 19.3616 25.4410 0.083
412 19.2559 0.13710 0.071 189.617743 19.2559 0.7783 0.071
413 19.2092 0.03000 0.068 189.617801 19.2092 0.1630 0.068
414 19.4396 0.00522 0.068 189.617859 19.4396 0.0321 0.068
我想要做的是:在数据帧的每个部分创建单独的dataframes列'c0S/m'中的值超过0.1(例如上面示例中的行407-412)。
假设我在我的3000+行数据框中有7个部分,其中第二列中的一系列行超过0.1。我的if/for/while语句将切分这些部分并创建7个独立的数据框。
我试着研究最好的,但我找不到解决这个问题的问题。任何帮助表示赞赏。
谢谢。
答
这是另一种方式。
sub_set = df[df['c0S/m'] > 0.1]
last = None
for i in sub_set.index:
if last is None:
start = i
else:
if i - last > 1:
print start, last
start = i
last = i
我认为它的工作原理。 (而不是print start, last
你可以插入代码来创建你想要的原始数据帧的片)。
一些巧妙的技巧here做得更好。
答
你可以试试这个:
首先添加的列0或1,根据该值是否大于1或小于更大。
df['splitter'] = np.where(df['c0S/m:'] > 1, 1, 0)
现在GROUPBY此列diff.cumsum()
df.groupby((df['splitter'].diff(1) != 0).astype('int').cumsum()).apply(lambda x: [x.index.min(),x.index.max()])
您获得所需的指数
splitter
1 [407, 411]
2 [412, 414]
3 [415, 415]
块现在你可以使用LOC
df.loc[407:411]
创建dataframes
注意:我添加了一行来样DF使用:
df.loc[415] = [19.01, 5.005, 0.09, 189.62, 19.01, 0.026, 0.09]
才能够更好的测试,因此其分裂3组
当你说“部分”或“部分”,你指的是一组连续的行,所有这些都有指定的入选标准?你想保留原始数据框中的索引吗? –
啊。我认为你的意思是将_consecutive_行满足条件的部分分开。对?这可能会很棘手。 – Bill
您可以先采取所有满足条件的行,然后使用行索引查找想要创建“分节”的点。除了循环遍历数据框和创建一组索引范围之外,我想不出有什么办法。 – Bill