说我有一个数据框df
import pandas as pd
df = pd.DataFrame({"id":["a", "b", "aa", "aaa", "bbb", "a"]})
在这种情况下,我想计算列id的字符串长度的计数。
在此示例中,id
中有3个字符串,其长度为1,长度为2的字符串为1,长度为2的字符串,因此,我想拥有一个反映该信息的表
str_length count
1 3
2 1
3 2
对数百万行执行此操作的最有效方法是什么?
这是我能想到的最好的方法,但是我听说使用apply
很慢
df_count = df.id.apply(lambda x: len(x)).value_counts()
df_count2 = pd.DataFrame({"str_length": df_count.index.tolist(), "count": df_count})
df_count2.sort_values("str_length")
产生。
str_length count
1 1 3
2 2 1
3 3 2
答案 0 :(得分:3)
您在这里
df.id.str.len().value_counts()
1 3
3 2
2 1
Name: id, dtype: int64
答案 1 :(得分:1)
使用分组依据进行计数。
(
df.groupby(by=df.id.apply(len))
.id.count()
.to_frame('count')
.rename_axis(index='str_length')
.reset_index()
)
str_length count
0 1 3
1 2 1
2 3 2
答案 2 :(得分:1)
numpy解决方案:
np.transpose(np.unique(df.id.map(len), return_counts=True))
Out[229]:
array([[1, 3],
[2, 1],
[3, 2]], dtype=int64)
创建DataFrame
pd.DataFrame(np.transpose(np.unique(df.id.map(len), return_counts=True)),
columns=['str_length', 'count'])
Out[231]:
str_length count
0 1 3
1 2 1
2 3 2
答案 3 :(得分:0)
或者,如果性能不是问题,我们可以使用
df.id.groupby(lambda x: len(df.id[x])).size()
或
df.id.groupby(df.id.apply(len)).size()