【问题标题】:Pandas - how often each string in comma separated rows is present within dataframePandas - 逗号分隔行中的每个字符串在数据框中出现的频率
【发布时间】:2019-04-09 15:27:38
【问题描述】:

我正在使用包含两列的 DataFrame,其中一列包含逗号分隔的字符串,第二列包含整数。我想用字符串遍历列,保存每一行中的每个唯一字符串,将第二列中的整数值分配给每个字符串。换句话说,

A           B
a,b,c,d     0
a,b,c,d     10
a,b,d,e     89
a,b,d,e     111

在这个例子中:

a = 220, b = 220, c = 10, d = 220, e = 210

我正在从我的 csv 文件中选择有趣的列,

revcat = DataFrame(data, columns = ['Tag', 'Revenue']) 

这为我提供了 'Tag' 中具有唯一值的 ndarray,并将其转换为另一个 DataFrame。

uniqtag = rev1.Tag.str.split(",").apply(pd.Series).stack().unique()
tag_stack = pd.DataFrame(uniqtag)

我被困在这里。基于此,我如何使用我找到的唯一字符串并将“收入”列中的值与每个“标签”相加来遍历原始“标签”列?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以使用Series.str.get_dummiesSeries.mulSeries.sum

    df['A'].str.get_dummies(sep=',').mul(df['B'], axis=0).sum()
    
    a    210
    b    210
    c     10
    d    210
    e    200
    

    说明

    df.A.str.get_dummies(sep=',')
    

    这会产生一个如下所示的 DataFrame:

       a  b  c  d  e
    0  1  1  1  1  0
    1  1  1  1  1  0
    2  1  1  0  1  1
    3  1  1  0  1  1
    

    然后将.mul 与您的值列一起使用将产生:

         a    b   c    d    e
    0    0    0   0    0    0
    1   10   10  10   10    0
    2   89   89   0   89   89
    3  111  111   0  111  111
    

    最后,沿索引轴应用 .sum 将为您提供最终输出:

    a    210
    b    210
    c     10
    d    210
    e    200
    

    【讨论】:

      【解决方案2】:

      这是我要使用的步骤

      1. 在 "," 上拆分并使用 expand=True 获取每个字母在其自己的列中的数据框(我现在假设,根据您的示例,您始终拥有相同数量的分裂?这是真的吗?)

      2. “融化”该数据框,这样您就可以拥有一个长数据框,其中每一行都是一个字母,并且它在原始 df 中的索引是一个长数据框,而不是从原始 df 中的每一行创建多个列。

      3. 从索引转换为B 列中的值

      4. 按字母分组并在B之间求和。

      import pandas as pd
      
      data = [
          ("a,b,c,d", 0),
          ("a,b,c,d", 10),
          ("a,b,d,e", 89),
          ("a,b,d,e", 111),
      ]
      df = pd.DataFrame(data, columns=["A", "B"])
      
      #   A       B
      # 0 a,b,c,d 0
      # 1 a,b,c,d 10
      # 2 a,b,d,e 89
      # 3 a,b,d,e 111
      
      melted = df.A.str.split(",", expand=True).reset_index().melt(id_vars="index", value_name="A")
      melted["B"] = df.B.loc[melted["index"]].values
      melted.groupby("A").B.sum()
      
      # value
      # a    210
      # b    210
      # c    10
      # d    210
      # e    200
      

      注意 - 我认为您的问题中的总和不正确;其中一些似乎在 10 点前就关闭了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-25
        相关资源
        最近更新 更多