我正在试图了解如何只选择数据rows中位于两个特定行之间的行。这些行在其中一个列中包含两个特定的字符串。我将用这个例子作进一步的解释。
我有以下数据:
String Value
-------------------------
0 Blue 45
1 Red 35
2 Green 75
3 Start 65
4 Orange 33
5 Purple 65
6 Teal 34
7 Indigo 44
8 End 32
9 Yellow 22
10 Red 14
在"String“列中只有一个"Start”实例和一个"End“实例。我只想要在"String“列中包含"Start”和“to”的行之间的这个dataframe行,因此我希望生成这个输出dataframe:
String Value
-------------------------
3 Start 65
4 Orange 33
5 Purple 65
6 Teal 34
7 Indigo 44
8 End 32
另外,我想保持我保存的行的顺序,因此保持“开始”、“橙色”、“紫色”、“提尔”、“靛蓝”、“结束”的顺序。
我知道我可以通过以下操作来索引这些特定的列:
index_start = df.index[df['String'] == 'Start']
index_end = df.index[df['String'] == 'End']
但我不知道如何实际过滤掉这两个字符串之间的所有行。我如何在python中实现这一点?
发布于 2022-04-21 10:57:37
如果两个值都存在,则临时将"String“设置为索引:
df.set_index('String').loc['Start':'End'].reset_index()
产出:
String Value
0 Start 65
1 Orange 33
2 Purple 65
3 Teal 34
4 Indigo 44
5 End 32
或者,使用isin
(然后开始/结束的顺序无关紧要):
m = df['String'].isin(['Start', 'End']).cumsum().eq(1)
df[m|m.shift()]
产出:
String Value
3 Start 65
4 Orange 33
5 Purple 65
6 Teal 34
7 Indigo 44
8 End 32
发布于 2022-04-21 10:53:55
这应该足够了,当您尝试按索引定位行时,iloc[]是有用的,它的工作方式与列表中的片相同。
index_start = df.index[df['String'] == 'Start']
index_end = df.index[df['String'] == 'End']
df.iloc[index_start[0]:index_end[0]+1]
更多信息:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.iloc.html
发布于 2022-04-21 10:50:17
您可以使用eq
+ cummax
和filter构建布尔掩码:
out = df[df['String'].eq('Start').cummax() & df.loc[::-1, 'String'].eq('End').cummax()]
输出:
String Value
3 Start 65
4 Orange 33
5 Purple 65
6 Teal 34
7 Indigo 44
8 End 32
https://stackoverflow.com/questions/71959399
复制相似问题