我有一个包含3000多行的Pandas数据框,如下所示:
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
我想要做的是:从数据框的每个部分创建单独的数据帧,其中'c0S / m'列中的值超过0.1(例如上例中的行407-412)。
因此,假设我的3000多行数据帧中有7个部分,其中第二列中的一系列行超过0.1。我的if / for / while语句将对这些部分进行切片并创建7个独立的数据帧。
我尝试了尽可能最好的研究,但找不到可以解决这个问题的问题。任何帮助表示赞赏。
谢谢。
答案 0 :(得分:0)
这是另一种方式。
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可以做得更好。
答案 1 :(得分:0)
你可以试试这个:
首先根据值是否大于1来添加0或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]
注意:我使用以下方法为您的样本df添加了一行:
df.loc[415] = [19.01, 5.005, 0.09, 189.62, 19.01, 0.026, 0.09]
能够更好地测试,因此能够在3组中进行分裂