【问题标题】:Group the word count of a data frame according to the diferent labels stored in a column根据存储在列中的不同标签对数据框的字数进行分组
【发布时间】:2020-02-10 17:38:49
【问题描述】:

我想知道对于数据框的所有单元格上的两个类来说,哪些是最具代表性的词

Q1                                                             Q2                                                                           Q3                                                                                                                                                   Label
Cada vez que gobiernan los socialistas provocan paro y crisis. Zapatero hace su 39 visita a la dictadura venezolana ¿Qué motiva este viaje? Según Sánchez en Cataluña la ley no basta, y según Iceta hay que amnistiar a los que dieron un golpe al Estado. ¿Cuánta dignidad cuesta el poder?    PP
Los #10acuerdosdepais responden a los#ODS #Agenda2030          Hacia un nuevo contrato social global : capital,trabajo,planeta y Estado.   Premio muy merecido,@duarteoceans. Es uno de los biólogos marinos más prestigiosos,que nos ayudan a entender la interacción océano-cambio climático.  PSOE
...

我想:

{
    'PP':{'Zapatero':2, 'truco': 3, ...},
    'PSOE':{'Gobierno':4,'truco':2}
}

我想这样做:

wordfreq = []
for i, row in df.iloc[:,25:].iterrows():
    for column in df.iloc[:,25:].columns:
        wordlist = row[column].split() # I divided each cell in a column of words
        for w in wordlist:
            wordfreq.append(wordlist.count(w)) # I add up the words in one
            # But I don't know how to add them to the dictionary of specific words for each labe

我的问题是我不知道如何将它们添加到每个标签的特定“labelwordfreq”单词的字典中。

终端回答我:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-54-cc03daf63866> in <module>
      2 for i, row in df.iloc[:,25:].iterrows():
      3     for column in df.iloc[:,25:].columns:
----> 4         wordlist = row[column].split() # Dividí cada celda de una columna de palabras
      5         for w in wordlist:
      6             wordfreq.append(wordlist.count(w)) # Sumo las palabras en uno

AttributeError: 'float' object has no attribute 'split'

我可能在这里有一个nan。

我认为我的尺寸可能有问题,因为它适用于所有世界(我可以只获得前 10 名)

更新尝试 Grzegorz Skibinski 的回答

我尝试了以下代码:

cols=df.iloc[:,25:-1].columns.values
df["Q"]=x[0]
for i in cols[1:]:
    df["Q"]=df["Q"].str.cat(df[i], sep=" ")

    df["Q"]=df["Q"].str.lower()

但是得到了:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-87-67083b1bcc84> in <module>
      6     df["Q"]=df["Q"].str.lower()
      7 
----> 8 df["Q"]=df["Q"].str.split("[^\w]").apply(Counter)

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
   3589             else:
   3590                 values = self.astype(object).values
-> 3591                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   3592 
   3593         if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

C:\ProgramData\Anaconda3\lib\collections\__init__.py in __init__(*args, **kwds)
    564             raise TypeError('expected at most 1 arguments, got %d' % len(args))
    565         super(Counter, self).__init__()
--> 566         self.update(*args, **kwds)
    567 
    568     def __missing__(self, key):

C:\ProgramData\Anaconda3\lib\collections\__init__.py in update(*args, **kwds)
    651                     super(Counter, self).update(iterable) # fast path when counter is empty
    652             else:
--> 653                 _count_elements(self, iterable)
    654         if kwds:
    655             self.update(kwds)

TypeError: 'float' object is not iterable

df["Q"]=df["Q"].str.split("[^\w]").apply(Counter)

我注意到第 72 行是 NaN,所以我删除了它:

df = df.drop(72)

所以现在df['Q'] 是:

0     {'s02q02': 1, 'self': 1, 'employed': 3, '': 11...
1     {'s02q02': 1, 'unemployed': 2, '': 270, 'perso...

如何根据df['Label']收集它们?

【问题讨论】:

    标签: python-3.x counter frequency


    【解决方案1】:

    你可以这样做:

    from collections import Counter
    
    df["Q"]=df["Q1"].str.cat(df["Q2"], sep=" ").str.cat(df["Q3"], sep=" ").str.lower()
    
    df["Q"]=df["Q"].str.split("[^\w]").apply(Counter)
    

    这基本上会做以下事情:

    (1) 连接所有 Q 列(如果我理解正确的话 - 就是您想要的,即计算单词,而不管它们出现在 Q 上)。另外-我从最后一列中取了小写字母(我假设您想要不区分大小写)

    (2) 按每个字符拆分连接的值,即不是字母

    (3) 应用Counter 统计(2)中拆分得到的列表中的单词

    【讨论】:

    • 问他们所有人:)
    • 哈哈 ^^ 我的意思是Q1 to ... Qn ^^
    • 你可以把它放在一个循环中 :) 只做df["Q"]=df["Q1"] 然后for i in range(2,n): df["Q"]=df["Q"].str.cat(df[f"Q{I}"], sep=" ") 在这之后:df["Q"]=df["Q"].str.lower()
    • .str.cat(df["Q3"], sep=" ").str.lower() 是否允许我根据存储在最后一列中的字符串(PSOE 或 PP)过滤两个不同的计数器?
    猜你喜欢
    • 2013-07-30
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多