我想在pandas数据框列中找到一个特定的模式,并返回相应的索引值以对数据框进行子集化。
这是带有可能模式的示例数据框:
生成数据框的代码段:
import pandas as pd
import numpy as np
Observations = 10
Columns = 2
np.random.seed(123)
df = pd.DataFrame(np.random.randint(90,110,size=(Observations, Columns)),
columns = ['ColA','ColB'])
datelist = pd.date_range(pd.datetime(2017, 7, 7).strftime('%Y-%m-%d'),
periods=Observations).tolist()
df['Dates'] = datelist
df = df.set_index(['Dates'])
pattern = [100,90,105]
print(df)
数据框:
ColA ColB
Dates
2017-07-07 103 92
2017-07-08 92 96
2017-07-09 107 109
2017-07-10 100 91
2017-07-11 90 107
2017-07-12 105 99
2017-07-13 90 104
2017-07-14 90 105
2017-07-15 109 104
2017-07-16 94 90
下面,感兴趣的格局发生Column A
的日期2017-07-10
来2017-07-12
,这就是我想要结束了一下:
所需的输出:
2017-07-10 100 91
2017-07-11 90 107
2017-07-12 105 99
如果同一模式多次出现,我希望以相同的方式对数据帧进行子集化,并计算该模式出现的次数,但是只要我将第一步弄清楚,我希望这会更直接。
感谢您的任何建议!
这是一个解决方案:
使用滚动检查是否在任何列中找到了模式。这将为您提供与模式匹配的组的最后一个索引
matched = df.rolling(len(pattern)).apply(lambda x: all(np.equal(x, pattern)))
matched = matched.sum(axis = 1).astype(bool) #Sum to perform boolean OR
matched
Out[129]:
Dates
2017-07-07 False
2017-07-08 False
2017-07-09 False
2017-07-10 False
2017-07-11 False
2017-07-12 True
2017-07-13 False
2017-07-14 False
2017-07-15 False
2017-07-16 False
dtype: bool
对于每个匹配项,添加完整模式的索引:
idx_matched = np.where(matched)[0]
subset = [range(match-len(pattern)+1, match+1) for match in idx_matched]
获取所有模式:
result = pd.concat([df.iloc[subs,:] for subs in subset], axis = 0)
result
Out[128]:
ColA ColB
Dates
2017-07-10 100 91
2017-07-11 90 107
2017-07-12 105 99
问题内容: 给定一个熊猫数据框,其中包含可能在此处和附近散布的NaN值: 问题: 如何确定哪些列包含NaN值?特别是,我可以获取包含NaN的列名称的列表吗? 问题答案: 更新: 使用熊猫0.22.0 较新的Pandas版本具有新的方法‘DataFrame.isna()’和‘DataFrame.notna()’ 作为列列表: 选择这些列(至少包含一个值): 旧答案: 尝试使用isnull(): 或作
问题内容: 我有以下熊猫数据框: 产生此结果: 我如何传播,以便最终得到这个: 问题答案: 使用或: 但是,如果重复,需要或集合体,或可以改变,…: ValueError:索引包含重复的条目,无法重塑 编辑: 对于设置为和的清洁:
问题内容: 在其他语言(例如R或SQL)中找到该选项的地方,但我不太确定如何在Pandas中进行此操作。 因此,我有一个具有1262列和1行的文件,并且每次出现特定值时都需要返回列标题。 例如说这个测试数据框: 我需要找到列名,例如value = 38.15。最好的方法是什么? 谢谢 问题答案: 看到只有一行,那么您可以调用结果并使用它来屏蔽列: 分解以上内容: 您也可以使用param :
问题内容: 我正在寻找编写一个快速脚本,该脚本将通过具有两列的csv文件运行,并为我提供行,其中B列中的值从一个值切换为另一个: 例如: 数据框: 会告诉我更改发生在第2行和第3行之间。我知道如何使用for循环获取这些值,但我希望有解决此问题的更Python方式。 问题答案: 您可以为差异创建一个新列 这将是您所需的行
问题内容: 我想获取一列中字符串的频率计数。一方面,这类似于将数据框折叠为仅反映列中的字符串的一组行。我能够通过循环解决此问题,但知道有更好的解决方案。 df示例: 并想出去: 我搜索了很多论坛,但找不到合适的答案。 我假设使用pivot_table方法是正确的方法,但是无法获取正确的参数来折叠没有为输出df提供明显索引的表。 我可以通过使用value_counts()遍历每列并将每个值计数系列附
问题内容: 我从CSV文件加载了一些机器学习数据。前两列是观察值,其余两列是要素。 目前,我执行以下操作: 它给出了类似的东西: 我想两个dataframes切片此数据框:包含列一个和和包含一个列,和。 不可能写这样的东西 我不确定最好的方法是什么。我需要吗? 顺便说一下,我发现数据帧索引非常不一致:允许,但不允许。另一方面,不允许,但允许。是否有实际原因?如果列是由Int索引的,这确实令人困惑,