Python 识别和计算数据帧中的唯一模式

Python 识别和计算数据帧中的唯一模式,python,python-3.x,pandas,Python,Python 3.x,Pandas,在问题的末尾,您将找到具有可复制输入的代码片段和所需输出的示例 挑战: import pandas as pd df = pd.DataFrame({'column_A':[1,1,1,0,0,0,1,0,0,1,1,1], 'column_B':[1,1,1,1,1,0,0,0,1,1,0,0]}) colnames = list(df) df[colnames] = df[colnames].apply(pd.to_numeric) datelist

在问题的末尾,您将找到具有可复制输入的代码片段和所需输出的示例

挑战:

import pandas as pd
df = pd.DataFrame({'column_A':[1,1,1,0,0,0,1,0,0,1,1,1],
                   'column_B':[1,1,1,1,1,0,0,0,1,1,0,0]})

colnames = list(df)
df[colnames] = df[colnames].apply(pd.to_numeric)
datelist = pd.date_range(pd.datetime.today().strftime('%Y-%m-%d'), periods=len(df)).tolist()
df['dates'] = datelist
df = df.set_index(['dates'])
print(df)
df2 = pd.DataFrame({'pattern':[5,3,2,1],
               'column_A':[0,2,0,1],
               'column_B':[1,0,1,0]})
df2 = df2.set_index(['pattern'])
print(df2)
我有这样一个数据帧:

dataframe有两列,模式为1和0,如下所示:

或者这个:

列的数量会有所不同,模式的长度也会有所不同。 但是,数据帧中的唯一数字将是0或1

我想识别这些模式,统计它们的每次出现,并构建一个包含结果的数据框架。为了简化整个过程,我想把重点放在一个,而忽略零个。在这种特殊情况下,所需的输出为:

我希望这个过程能够识别,例如,模式[1,1,1]在列_A中出现两次,而在列_B中根本没有出现。请注意,我在数据帧中使用了模式的总和作为索引

可复制输入:

import pandas as pd
df = pd.DataFrame({'column_A':[1,1,1,0,0,0,1,0,0,1,1,1],
                   'column_B':[1,1,1,1,1,0,0,0,1,1,0,0]})

colnames = list(df)
df[colnames] = df[colnames].apply(pd.to_numeric)
datelist = pd.date_range(pd.datetime.today().strftime('%Y-%m-%d'), periods=len(df)).tolist()
df['dates'] = datelist
df = df.set_index(['dates'])
print(df)
df2 = pd.DataFrame({'pattern':[5,3,2,1],
               'column_A':[0,2,0,1],
               'column_B':[1,0,1,0]})
df2 = df2.set_index(['pattern'])
print(df2)
所需输出:

import pandas as pd
df = pd.DataFrame({'column_A':[1,1,1,0,0,0,1,0,0,1,1,1],
                   'column_B':[1,1,1,1,1,0,0,0,1,1,0,0]})

colnames = list(df)
df[colnames] = df[colnames].apply(pd.to_numeric)
datelist = pd.date_range(pd.datetime.today().strftime('%Y-%m-%d'), periods=len(df)).tolist()
df['dates'] = datelist
df = df.set_index(['dates'])
print(df)
df2 = pd.DataFrame({'pattern':[5,3,2,1],
               'column_A':[0,2,0,1],
               'column_B':[1,0,1,0]})
df2 = df2.set_index(['pattern'])
print(df2)
我迄今为止的尝试:

import pandas as pd
df = pd.DataFrame({'column_A':[1,1,1,0,0,0,1,0,0,1,1,1],
                   'column_B':[1,1,1,1,1,0,0,0,1,1,0,0]})

colnames = list(df)
df[colnames] = df[colnames].apply(pd.to_numeric)
datelist = pd.date_range(pd.datetime.today().strftime('%Y-%m-%d'), periods=len(df)).tolist()
df['dates'] = datelist
df = df.set_index(['dates'])
print(df)
df2 = pd.DataFrame({'pattern':[5,3,2,1],
               'column_A':[0,2,0,1],
               'column_B':[1,0,1,0]})
df2 = df2.set_index(['pattern'])
print(df2)
我一直在研究一个解决方案,其中包括嵌套for循环,我计算每次观测值等于零时重置的运行和。它还包括
df.apply(lambda x:x.value_counts())
等函数。但至少可以说这很混乱,到目前为止还不是100%正确

谢谢你的任何其他建议

以下是我的尝试:

def fun(ser):
    ser = ser.dropna()
    ser = ser.diff().fillna(ser)
    return ser.value_counts()


df.cumsum().where((df == 1) & (df != df.shift(-1))).apply(fun)
Out: 
     column_A  column_B
1.0       1.0       NaN
2.0       NaN       1.0
3.0       2.0       NaN
5.0       NaN       1.0
第一部分(
df.cumsum()。其中((df==1)和(df!=df.shift(-1))
)生成累积和:

            column_A  column_B
dates                         
2017-08-04       NaN       NaN
2017-08-05       NaN       NaN
2017-08-06       3.0       NaN
2017-08-07       NaN       NaN
2017-08-08       NaN       5.0
2017-08-09       NaN       NaN
2017-08-10       4.0       NaN
2017-08-11       NaN       NaN
2017-08-12       NaN       NaN
2017-08-13       NaN       7.0
2017-08-14       NaN       NaN
2017-08-15       7.0       NaN

因此,如果我们忽略了NaN,而采用了Diff,我们就可以得到这些值。这就是函数所做的:它去掉NaN,然后取差值,这样就不再是累积和了。它最终返回值计数。

也许这一个类似:感谢您抽出时间解释解决方案中的细节!