pandas panda:使用组合逻辑提取 Dataframe , Dataframe 的列包含完全匹配的字符串或仅包含其组合

2izufjch  于 2022-12-09  发布在  其他
关注(0)|答案(2)|浏览(133)

我有一个 Dataframe ,其中sig列有字符串,它是作为一个或一组字符串来的。如果我想只提取 Dataframe ,其中我的字符串匹配,我该怎么做?

df = pd.DataFrame()
df['sig'] = ['301','302','303','405','405 409','302 301','303 301','405','560','309','301 302 303','303 304','305','305 304 303 302 301', '555','565','301 302 303 304']
df['val'] = [45,25,1,54,12,51,52,1,4,152,786,145,1,555,7595,77,89]

如果我添加字符串'301 302 303'来查找相同的匹配项,以及它包含组合的位置,但它也会提供包含301 302 303 304或类似内容的其他行,我尝试了这种方法

dtc = '301 302 303'
dtcs = dtc.split()
x = df['sig'].str.contains(dtcs[0])
for i in range (1, len(dtcs)):
    x = x | df['sig'].str.contains(dtcs[i])
    df_dtc = df[x]
    print(df_dtc)
    print('****************')

输出如下

# output
                    sig  val
0                   301   45
1                   302   25
5               302 301   51
6               303 301   52
10          301 302 303  786
13  305 304 303 302 301  555
16      301 302 303 304   89
****************
                    sig  val
0                   301   45
1                   302   25
2                   303    1
5               302 301   51
6               303 301   52
10          301 302 303  786
11              303 304  145
13  305 304 303 302 301  555
16      301 302 303 304   89

预期输出

output 

sig           val

301            45
302            25
303             1
302 301        51 
303 301        52
301 302 303   786

这意味着它的所有组合,没有重复,只得到确切的或组合的,因为你可以看到,它不是添加行

303 304
305 304 303 302 301
301 302 303 304 etc.....

我该怎么做?

dsekswqp

dsekswqp1#

下面是一个有点丑陋,但做什么,我相信是你正在寻找的...

# Convert 'sig' to a set
df['sig_as_set'] = df['sig'].str.split().map(set)

# same for 'dtc'
dtc_as_set = {'301', '302', '303'}

# Locate rows of interest (where sig_of_set must be subset of dtc_as_set)
df['row_of_interest'] = df['sig_as_set'].apply(lambda sos: sos.issubset(dtcs_as_set))

df.query('row_of_interest')传回...

sig         val sig_as_set      row_of_interest
0   301          45 {301}           True
1   302          25 {302}           True
2   303           1 {303}           True
5   302 301      51 {301, 302}      True
6   303 301      52 {301, 303}      True
10  301 302 303 786 {301, 303, 302} True

这假定sig非空。

goucqfw6

goucqfw62#

只需首先使用split字符串,然后使用itertools.permutations并连接字符串匹配的 Dataframe 。

dt = '301 302 303' 
import itertools
list1 = dt.split()
parent_df = pd.DataFrame()
for i in range (1, len(list1) + 1):
    for subset in itertools.permutations(list1, i):
        a = ' '.join(subset)
        df_dtc = df[df['sig'] == a]
        parent_df = pd.concat([parent_df,df_dtc], axis=0)
        del(df_dtc)
        
print(parent_df)

此操作的预期输出如下

#output

            sig  val
0           301   45
1           302   25
2           303    1
6       301 303   52
5       302 301   51
10  301 302 303  786

相关问题