在python pandas.Series对象中对行进行有效的操作

时间:2018-08-15 14:33:53

标签: python pandas time

我想基于我的pandas.Dataframe中包含字母数字字符串的一列来计算多个特征。

我想根据这些字符串中的每一个来计算新值,例如字母,数字,元音和辅音字符的比率。因为我有100亿个字符串,所以我想找到一种最有效的方法来计算这些值。

目前,我以pandas.DataFrame df和列domain的以下方式对其进行计算:

alphabet = list("abcdefghijklmnopqrstuvwxyz")
fn = lambda row: sum(row.domain.count(a) for a in alphabet) / len(row.domain)
df.assign(alphabetic_ratio=df.apply(fn, axis=1).values)

目前,对于数字,元音和辅音比率,我遵循相同的方案,但是由于字符串数量众多,因此计算所需的时间太长(字母比率为6+小时)。

我不确定我是否在做任何明显错误的事情来解释为什么要花费这么多时间,或者是否可以实施任何技巧来加快计算速度。

我知道将代码转换为C并使用cython 可能可以节省时间,但是我想首先探索真正的pythonic解决方案。如果有人能告诉我这肯定会改善时间尺度,那么我会尝试一下。

我尝试了其他方法来确定字符是否为字母,例如检查ord(a)数字或`a.isalpha()',但是时间相同。

1 个答案:

答案 0 :(得分:0)

希望此示例有所帮助:

df = pd.DataFrame({'A': ['John', 'Michael', 'Jezus', 'Donald', 'Suzy']})

df['B'] = df.A.str.count('[a-z]') / df.A.str.len()

df
#         A         B
#0     John  0.750000
#1  Michael  0.857143
#2    Jezus  0.800000
#3   Donald  0.833333
#4     Suzy  0.750000

从您的示例看来,您似乎仅查看与本示例中的domain相同的A列。