我有一个巨大的文件(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
由于
答案 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)
您可以在groupby
上id
并使用apply
到join
列表。
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