python中的函数,用于在大文件中搜索特定名称的可能组合

时间:2016-11-30 05:54:57

标签: python string pandas join group-by

我有一个巨大的文件(50,000行),有2列(id和name)。一个id可以有不同的名称,但我只是寻找特定的名称及其ID。这个特定的名称可能有任何组合,我需要检查整个文件,他们聚集在一起的任何可能的组合。 我写了以下函数,它没有给我任何错误,但它也没有用。

我也想计算这些名字的任何组合。

顺便说一句,我正在使用pandas并将数据导入为数据框。

例如:

re.findall('<Row.*(?:.|\n)+</Row>', table)
 re.findall('<Row(?:.|\n)?[^</Row>]*', table)

我想要的结果如下:

id  name
a    TD
a    NB
a    LB
b    LR
b    NB
c    LR
c    NB
d    LB

为了我想要的计数:

a  TD,NB,LR  # they might have any combination I just wrote them as example
b  NB,LR
c  NB,LR
d  LB

由于

2 个答案:

答案 0 :(得分:1)

您可以先使用apply join

来使用groupby
df1 = df.groupby('id')['name'].apply(','.join)
print (df1)
id
a    TD,NB,LB
b       LR,NB
c       LR,NB
d          LB
Name: name, dtype: object

然后value_counts

print (df1.value_counts())
LR,NB       2
LB          1
TD,NB,LB    1
Name: name, dtype: int64

如果要过滤联接输出中的某些值,请使用join | or(正则表达式df1 = df.groupby('id')['name'].apply(','.join) df2 = df1[df1.str.contains('|'.join(['LR','NB']))] print (df2) id a TD,NB,LB b LR,NB c LR,NB Name: name, dtype: object print (df2.value_counts()) LR,NB 2 TD,NB,LB 1 Name: name, dtype: int64 )和contains

#get all id where is value LR or NB (unique is for better performance)
ids = df.loc[df.name.isin(['LR','NB']), 'id'].unique()
print (ids)
['a' 'b' 'c']

#filter by ids
df3 = df[df.id.isin(ids)]
print (df3)
  id name
0  a   TD
1  a   NB
2  a   LB
3  b   LR
4  b   NB
5  c   LR
6  c   NB

df4 = df3.groupby('id')['name'].apply(','.join)
print (df4)
id
a    TD,NB,LB
b       LR,NB
c       LR,NB
Name: name, dtype: object

print (df4.value_counts())
LR,NB       2
TD,NB,LB    1
Name: name, dtype: int64

另一种可能的解决方案是使用双boolean indexing

进行过滤
np.random.seed(123)
N = 1000000
L1 = list("abcdefghijklmnopqrstuvwxyz")
df = pd.DataFrame({'id':np.random.choice(L1, N), 
                   'name': np.random.choice(L1, N)})

In [31]: %timeit (df.groupby('id')['name'].apply(','.join))
10 loops, best of 3: 130 ms per loop

In [32]: %timeit (df.groupby('id')['name'].apply(lambda x: ','.join(x.tolist())))
10 loops, best of 3: 131 ms per loop

我对两种解决方案的性能都非常感兴趣 - 它是一样的:

mHandler = new Handler(getMainLooper);

答案 1 :(得分:1)

您可以在groupbyid并使用applyjoin列表。

In [45]: id_counts = df.groupby('id')['name'].apply(lambda x: ','.join(x.tolist()))

In [46]: id_counts
Out[46]:
id
a    TD,NB,LB
b       LR,NB
c       LR,NB
d          LB
Name: name, dtype: object

然后使用value_counts来计算值。

In [47]: id_counts.value_counts()
Out[47]:
LR,NB       2
TD,NB,LB    1
LB          1
Name: name, dtype: int64