如何修复熊猫中的“级别必须与名称相同(无)”错误

时间:2019-03-30 20:24:25

标签: python pandas

我有一个7000万行的数据框,我试图在swifter库的帮助下使用apply函数在数据框中添加一列

swifter库https://github.com/jmcarpenter2/swifter/blob/master/README.md

当我尝试运行时,它给了我一个错误

“级别必须与名称相同(无)”

#myfunction

def alert(c):
    if c.count(" ") == 0:
        return 'ngram1'
    elif c.count(" ") == 1:
        return 'ngram2'
    elif c.count(" ")==2:
        return 'ngram3'
    else:
        return 'NotAvailable'

all_dfs['ngram'] = all_dfs["word"].swifter.apply(alert,axis=1)


# sample dataframe
df = pd.DataFrame({'word': ["abc","abd cds" ,"abc cds fgh"], 'freq': [5, 6, 7],"doc":["666","5555","333"})

预期输出是应添加特定值的列,但我收到错误消息“级别必须与名称相同(无)”

根据我的想法,swifter只能使用数字列,

任何其他方式将不胜感激

1 个答案:

答案 0 :(得分:0)

我认为这与“计数”方法有关。我使用freq字段尝试了您的代码,但没有用。

这在一个小例子中可以达到您预期的结果。

import string 
df['ngram'] = df["word"].apply(alert)
def alert_1(s):
    ng = sum([i.strip(string.punctuation).isalpha() for i in s.split()])
    if ng == 1:
        return 'ngram1'
    elif ng == 2:
        return 'ngram2'
    elif ng ==3:
        return 'ngram3'
    else:
        return 'NotAvailable'
    return sum([i.strip(string.punctuation).isalpha() for i in s.split()])

df.loc[:,"ngram_2"] = df["word"].swifter.apply(alert_1)
df

    word        freq    doc  ngram  ngram_2
0   abc            5    666  ngram1 ngram1
1   abd cds        6    5555 ngram2 ngram2
2   abc cds fgh    7    333  ngram3 ngram3

让我知道这是否适合您较大的数据集。 不知道更快,但是从现在开始我将在我的工作中实施它。