gpt4 book ai didi

python - 在索引上使用 str.count() 创建一个数据框

转载 作者:行者123 更新时间:2023-12-01 03:55:32 25 4
gpt4 key购买 nike

编辑(感谢Jezrael引导我做到这一点):

我有一个电话号码列表,我想为每个号码计算每个数字出现的次数。您会明白,双重 for 循环是不可能的,因为我有几十万个电话号码需要计算。

为此,我创建了一个数据框(因为我觉得这可能是一种有效的方法),其中每行包含电话号码的分割:

numbers = ['0615260518','0815465948','0215616235','0415291826']
df = pd.DataFrame([list(number) for number in numbers])


Out[1]:
0 1 2 3 4 5 6 7 8 9
0 0 6 1 5 2 6 0 5 1 8
1 0 8 1 5 4 6 5 9 4 8
2 0 2 1 5 6 1 6 2 3 5
3 0 4 1 5 2 9 1 8 2 6

然后我需要用所需的计数填充它。期望的输出:

Out[2]:
0 1 2 3 4 5 6 7 8 9
0615260518 2 2 1 0 0 2 2 0 1 0
0815465948 1 1 0 0 2 2 1 0 2 1
0215616235 1 2 2 1 0 2 2 0 0 0
0415291826 1 2 2 0 1 1 1 0 1 1

这是一种非Python式的实现方式:

for num in df.index:
for col in df.columns:
df.ix[num,col] = num.count(str(col))

计算时间太长,然后 Jezrael 为我提供了这个解决方案:

df.apply(lambda x: x.value_counts(), axis=1).fillna(0).astype(int)

这好多了,但仍然太长。所以我尝试替换不是为小数据帧设计的 value_counts:

df.apply(lambda x: digit_count(''.join(x)), axis=1)

地点:

def digit_count(number):
my_string = list(number.lower())
my_dict = []
for i in np.arange(10):
my_dict.append(my_string.count(str(i)))
return my_dict

速度大约快了 3 倍。但是有没有什么方法可以做得更快(我觉得这个迭代不是最佳的)。

最佳答案

可以先转换index to_series ,因为apply尚不适用于 index 。最后apply value_counts , fillna并通过 astype 转换为 int :

a = (df.index.to_series().apply(lambda x: pd.Series(list(x))))
print (a)
0 1 2 3 4 5 6 7 8 9
0615260518 0 6 1 5 2 6 0 5 1 8
0815465948 0 8 1 5 4 6 5 9 4 8
0215616235 0 2 1 5 6 1 6 2 3 5
0415291826 0 4 1 5 2 9 1 8 2 6

print (a.apply(lambda x: x.value_counts(), axis=1).fillna(0).astype(int))

0 1 2 3 4 5 6 8 9
0615260518 2 2 1 0 0 2 2 1 0
0815465948 1 1 0 0 2 2 1 2 1
0215616235 1 2 2 1 0 2 2 0 0
0415291826 1 2 2 0 1 1 1 1 1

编辑:

from collections import Counter
print (pd.DataFrame([x for x in a.apply(Counter, axis=1)]))
0 1 2 3 4 5 6 8 9
0 2 2 1.0 NaN NaN 2 2 1.0 NaN
1 1 1 NaN NaN 2.0 2 1 2.0 1.0
2 1 2 2.0 1.0 NaN 2 2 NaN NaN
3 1 2 2.0 NaN 1.0 1 1 1.0 1.0

时间(len(df)=4):

In [288]: %timeit (a.apply(lambda x: x.value_counts(), axis=1))
100 loops, best of 3: 3.74 ms per loop

In [289]: %timeit (pd.DataFrame([x for x in a.apply(Counter, axis=1)]))
1000 loops, best of 3: 1.27 ms per loop

(len(df)=4k):

In [296]: %timeit (pd.DataFrame([x for x in a.apply(Counter, axis=1)]))
10 loops, best of 3: 87 ms per loop

In [297]: %timeit (a.apply(lambda x: x.value_counts(), axis=1))
1 loop, best of 3: 2.45 s per loop

关于python - 在索引上使用 str.count() 创建一个数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37526889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com