将存储为字符串的哈希ID列表转换为具有唯一值的列

2024-04-23 22:39:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe,在其中的一列中,我有一个散列值列表,存储为字符串:

'[d85235f50b3c019ad7c6291e3ca58093,03e0fb034f2cb3264234b9eae09b4287]' just to be clear.

数据帧看起来像

  1
0 [8a88e629c368001c18619c7cd66d3e96, 4b0709dd990a0904bbe6afec636c4213, c00a98ceb6fc7006d572486787e551cc, 0e72ae6851c40799ec14a41496d64406, 76475992f4207ee2b209a4867b42c372]
1 [3277ded8d1f105c84ad5e093f6e7795d]
2 [d85235f50b3c019ad7c6291e3ca58093, 03e0fb034f2cb3264234b9eae09b4287]

我想创建此列中存在的唯一哈希id的列表。你知道吗

有效的方法是什么? 谢谢


Tags: to数据方法字符串iddataframe列表be
3条回答

IIUC,你想把数据展平。使用yaml.load将其转换为列表列。你知道吗

import yaml

df = df.applymap(yaml.load)
print(df)
                                            1
0  [8a88e629c368001c18619c7cd66d3e96, 4b0709dd990...
1                 [3277ded8d1f105c84ad5e093f6e7795d]
2  [d85235f50b3c019ad7c6291e3ca58093, 03e0fb034f2...

最简单的方法是从旧数据帧的值构造一个新的数据帧。你知道吗

out = pd.DataFrame(np.concatenate(df.iloc[:, 0].values.tolist()))
print(out)

                                  0
0  8a88e629c368001c18619c7cd66d3e96
1  4b0709dd990a0904bbe6afec636c4213
2  c00a98ceb6fc7006d572486787e551cc
3  0e72ae6851c40799ec14a41496d64406
4  76475992f4207ee2b209a4867b42c372
5  3277ded8d1f105c84ad5e093f6e7795d
6  d85235f50b3c019ad7c6291e3ca58093
7  03e0fb034f2cb3264234b9eae09b4287

选项1
请参阅下面的计时以获得最快的选项

你可以把解析和展平嵌入到一个理解中

[y for x in df['1'].values.tolist() for y in x.strip('[]').split(', ')]

['8a88e629c368001c18619c7cd66d3e96',
 '4b0709dd990a0904bbe6afec636c4213',
 'c00a98ceb6fc7006d572486787e551cc',
 '0e72ae6851c40799ec14a41496d64406',
 '76475992f4207ee2b209a4867b42c372',
 '3277ded8d1f105c84ad5e093f6e7795d',
 'd85235f50b3c019ad7c6291e3ca58093',
 '03e0fb034f2cb3264234b9eae09b4287']

在那里,您可以使用list(set())pd.uniquenp.unique

pd.unique([y for x in df['1'].values.tolist() for y in x.strip('[]').split(', ')])

array(['8a88e629c368001c18619c7cd66d3e96',
       '4b0709dd990a0904bbe6afec636c4213',
       'c00a98ceb6fc7006d572486787e551cc',
       '0e72ae6851c40799ec14a41496d64406',
       '76475992f4207ee2b209a4867b42c372',
       '3277ded8d1f105c84ad5e093f6e7795d',
       'd85235f50b3c019ad7c6291e3ca58093',
       '03e0fb034f2cb3264234b9eae09b4287'], dtype=object)

选项2
为简洁起见,请使用pd.Series.extractall

list(set(df['1'].str.extractall('(\w+)')[0]))

['8a88e629c368001c18619c7cd66d3e96',
 '4b0709dd990a0904bbe6afec636c4213',
 'c00a98ceb6fc7006d572486787e551cc',
 '0e72ae6851c40799ec14a41496d64406',
 '76475992f4207ee2b209a4867b42c372',
 '3277ded8d1f105c84ad5e093f6e7795d',
 'd85235f50b3c019ad7c6291e3ca58093',
 '03e0fb034f2cb3264234b9eae09b4287']

@jezrael的list(set())以我的理解是最快的

分析计时
为了比较解析和扁平化,我保留了相同的list(set())。你知道吗

%timeit list(set(np.concatenate(df['1'].apply(yaml.load).values).tolist()))
%timeit list(set([y for x in df['1'].values.tolist() for y in x.strip('[]').split(', ')]))
%timeit list(set(chain.from_iterable(df['1'].str.strip('[]').str.split(', '))))
%timeit list(set(df['1'].str.extractall('(\w+)')[0]))

1.01 ms ± 45 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
6.42 µs ± 219 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
279 µs ± 8.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
941 µs ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

这需要我的理解,并使用各种方法,使独特的比较这些速度

%timeit pd.unique([y for x in df['1'].values.tolist() for y in x.strip('[]').split(', ')])
%timeit np.unique([y for x in df['1'].values.tolist() for y in x.strip('[]').split(', ')])
%timeit list(set([y for x in df['1'].values.tolist() for y in x.strip('[]').split(', ')]))

57.8 µs ± 3.66 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
17.5 µs ± 552 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
6.18 µs ± 184 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

首先需要^{}^{},对于平坦化chain

print (df.columns.tolist())
['col']

#convert strings to lists per rows
#change by your column name if necessary    
s = df['col'].str.strip('[]').str.split(', ')
print (s)
0    [8a88e629c368001c18619c7cd66d3e96, 4b0709dd990...
1                   [3277ded8d1f105c84ad5e093f6e7795d]
2    [d85235f50b3c019ad7c6291e3ca58093, 03e0fb034f2...
Name: col, dtype: object

#check first value
print (type(s.iat[0]))
<class 'list'>

#get unique values - for unique values use set
from  itertools import chain
L = list(set(chain.from_iterable(s)))

['76475992f4207ee2b209a4867b42c372', '3277ded8d1f105c84ad5e093f6e7795d',
 'd85235f50b3c019ad7c6291e3ca58093', '4b0709dd990a0904bbe6afec636c4213', 
 'c00a98ceb6fc7006d572486787e551cc', '03e0fb034f2cb3264234b9eae09b4287', 
 '8a88e629c368001c18619c7cd66d3e96', '0e72ae6851c40799ec14a41496d64406']

from  itertools import chain
s = [x.strip('[]').split(', ') for x in df['col'].values.tolist()]
L = list(set(chain.from_iterable(s)))
print (L)

['76475992f4207ee2b209a4867b42c372', '3277ded8d1f105c84ad5e093f6e7795d', 
 'd85235f50b3c019ad7c6291e3ca58093', '4b0709dd990a0904bbe6afec636c4213', 
 'c00a98ceb6fc7006d572486787e551cc', '03e0fb034f2cb3264234b9eae09b4287',
 '8a88e629c368001c18619c7cd66d3e96', '0e72ae6851c40799ec14a41496d64406']

相关问题 更多 >