【问题标题】:How to append a list element to each row in a pandas Series?如何将列表元素附加到熊猫系列中的每一行?
【发布时间】:2017-03-26 15:09:52
【问题描述】:

我有以下熊猫系列,其中每一行都是一个没有空格的长字符串。它的形状为(250,)(即有250行)

import pandas as pd
sr1 = pd.Series(...)

                                                     0  
0    abdcadbcadcbadacbadbdddddacbadcbadadbcadbcadad...  
1    cacacdacadbdcadcabdcbadcbadbdabcabdbbbbbacdbac...  
2    bbbbbcadcacddabcadbcdabcbaddcbadcbadbcadbcaaba...  
3    acdbcdacdbadbadcbdbaaaacbdacadbacaddcabdacbdab...  
....

我有一个包含 250 个字符串的列表,我想将它们附加到每一行的开头。

list_of_strings = ["prefix1", "prefix2", "prefix3", ...., "prefix250"]

如何将list_of_strings 中的每个元素附加到sr1 中的相应行?生成的 Series 应如下所示:

                                                    0  
0    prefix1    abdcadbcadcbadacbadbdddddacbadcbadadbcadbcadad...  
1    prefix2    cacacdacadbdcadcabdcbadcbadbdabcabdbbbbbacdbac...  
2    prefix3    bbbbbcadcacddabcadbcdabcbaddcbadcbadbcadbcaaba...  
3    prefix4    acdbcdacdbadbadcbdbaaaacbdacadbacaddcabdacbdab...  
....

我的第一个想法是尝试类似:

sr1.insert(0, "prefixes", value = list_of_strings)

但这会引发错误AttributeError: 'Series' object has no attribute 'insert'。可以将sr1 转换为带有sr1 = sr1.to_frame() 的pandas DataFrame,而之前的.insert() 将产生一个包含两列的DataFrame。

在python中,我们可以使用指定的分隔符连接字符串,如下所示:

first = "firstword"
second = "secondword"
combined = "    ".join([first, second])
## outputs 'firstword    secondword'

我不确定 pandas 系列的情况如何。也许.apply(' '.join)不知何故?

【问题讨论】:

    标签: python pandas string-concatenation series


    【解决方案1】:

    您需要首先从list 创建Series,然后添加双精度add+ - 一个用于空格,另一个用于s

    s = pd.Series(['a','b','c'])
    list_of_strings = ["prefix1", "prefix2", "prefix3"]
    
    print (pd.Series(list_of_strings, index=s.index).add(' ').add(s))
    #same as
    #print (pd.Series(list_of_strings, index=s.index)+ ' ' + s)
    0    prefix1 a
    1    prefix2 b
    2    prefix3 c
    dtype: object
    

    cat 的另一个解决方案:

    print (pd.Series(list_of_strings, index=s.index).str.cat(s, sep=' '))
    0    prefix1 a
    1    prefix2 b
    2    prefix3 c
    dtype: object
    

    使用apply 的解决方案,但需要DataFrame - 通过构造函数或concat

    print (pd.DataFrame({'prefix':list_of_strings, 'vals':s}).apply(' '.join, axis=1))
    0    prefix1 a
    1    prefix2 b
    2    prefix3 c
    dtype: object
    

    print (pd.concat([pd.Series(list_of_strings, index=s.index), s], axis=1)
             .apply(' '.join, axis=1))
    0    prefix1 a
    1    prefix2 b
    2    prefix3 c
    dtype: object
    

    【讨论】:

      【解决方案2】:

      您可以制作一系列前缀,然后将两个系列加在一起:

      import pandas as pd
      
      s1 = pd.Series(['a'*10,'b'*10,'c'*10])
      
      s1
      # returns:
      # 0    aaaaaaaaaa
      # 1    bbbbbbbbbb
      # 2    cccccccccc
      
      
      s2 = pd.Series(['pre1', 'pre2', 'pre3'])
      
      s2+s1
      # returns:
      # 0    pre1aaaaaaaaaa
      # 1    pre2bbbbbbbbbb
      # 2    pre3cccccccccc
      

      【讨论】:

      • 这个答案有效,但仍然需要使用分隔符,即sr1 + " " + sr2
      【解决方案3】:

      将前缀列表变成一系列长度为 250 的前缀,然后添加它们。

      sr0 = pd.Series(list_of_strings)
      sr1 = sr0 + sr1
      

      【讨论】:

      • 这个答案有效,但仍然需要使用分隔符,即sr1 = sr0 + " " + sr1
      【解决方案4】:

      使用+运算符,它会自动连接字符串。

      pd.Series(list_of_strings) + "    " + sr1
      

      【讨论】:

      • 这个答案有效,但仍然需要使用分隔符,即pd.Series(list_of_strings) + " " + sr1
      猜你喜欢
      • 2019-10-01
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 2021-07-28
      • 2015-06-16
      • 2022-11-12
      • 1970-01-01
      相关资源
      最近更新 更多