【问题标题】:Compare all strings content in column(Series)比较列中的所有字符串内容(系列)
【发布时间】:2021-07-25 17:17:24
【问题描述】:

我有 50000 行的 Pandas 列,一开始它看起来像这样(每一行都是单独的行):

'JavaScript, Python, Ruby'
 'Java, PHP, Python'
 'Matlab, Python, R'
 ''
 'Matlab, Python'
 'C#, JavaScript'
 'Objective-C, Swift'
 'R, SQL'
 'C, C++, Java'
 'Java, JavaScript, Ruby'
 'C, C++'
 'JavaScript, VB.NET'
 'C, JavaScript'
 'Perl, Python'
 'C#, JavaScript, SQL'
 'Java'
 'PHP, SQL'
 'Java, Scala'
 'Java, JavaScript, Objective-C'
 'JavaScript, Python'
 'C#, Java'
 'JavaScript'
 'C'
 'C#, JavaScript, Matlab'
 'C#, Java, JavaScript'

我得到了大约 900 个独特的结果,但例如 'C#, Java, JavaScript''C#, JavaScript, Java' 对我来说是相同的(顺序无关紧要)。

我试图简化这一点,但我编写了不起作用的代码:

def String_compare(x):
    for i in range(0, len(df) - 1):        
        while i < (len(df) - 1):
            ## the same lenght and content
            if (set(x[i]) == set(x[i+1])):
                ## change content of the next row from the previous one
                x[i+1] == x[i]
        
## replace() was used to avoid problem with NaN values
df['ITLanguages'] = df['ITLanguages'].replace(np.nan, '?').map(lambda x: String_compare(x))

如何比较一列中的所有值,如果它们具有相同的长度和内容(编程语言的名称),则将其更改为一个版本(例如:'a、b、c'、'a、c、b ' 和 'b, a, c' 是一样的,我都选择了 'a, b, c' 版本)。

【问题讨论】:

    标签: pandas dataframe series


    【解决方案1】:

    我怀疑可能有一种更有效的方法来解决该解决方案旨在解决的任何问题(希望是矢量化的),但一种方法可能是对每个字符串中的单词进行排序,以便任何两个字符串具有等效集合无论如何,单词的顺序都是相同的。

    series = series.map(lambda s: ', '.join(sorted(w.strip() for w in s.split(',')))).str.strip()
    

    【讨论】:

      【解决方案2】:

      我先把你数据里的单引号都去掉了,然后我的想法和其他人一样。

      from io import StringIO
      
      data = """
      JavaScript, Python, Ruby
      Java, PHP, Python
      PHP, Java, Python
      Matlab, Python, R
      
      Matlab, Python
      C#, JavaScript
      Objective-C, Swift
      R, SQL
      C, C++, Java
      Java, JavaScript, Ruby
      C, C++
      JavaScript, VB.NET
      C, JavaScript
      Perl, Python
      C#, JavaScript, SQL
      Java
      PHP, SQL
      Java, Scala
      Java, JavaScript, Objective-C
      JavaScript, Python
      C#, Java
      JavaScript
      C
      C#, JavaScript, Matlab
      C#, Java, JavaScript
      """
      
      def f(x):
          y = sorted([i.strip() for i in x.strip("'").split(',')])
          return ",".join(y)
      
      
      s = StringIO(data)
      df = pd.read_csv(s, header=None, delimiter="\n")
      df[0] = df[0].map(f)
      print(df)
      
                                    0
      0        JavaScript,Python,Ruby
      1               Java,PHP,Python
      2               Java,PHP,Python
      3               Matlab,Python,R
      4                 Matlab,Python
      5                 C#,JavaScript
      6             Objective-C,Swift
      7                         R,SQL
      8                    C,C++,Java
      9          Java,JavaScript,Ruby
      10                        C,C++
      11            JavaScript,VB.NET
      12                 C,JavaScript
      13                  Perl,Python
      14            C#,JavaScript,SQL
      15                         Java
      16                      PHP,SQL
      17                   Java,Scala
      18  Java,JavaScript,Objective-C
      19            JavaScript,Python
      20                      C#,Java
      21                   JavaScript
      22                            C
      23         C#,JavaScript,Matlab
      24           C#,Java,JavaScript
      

      【讨论】:

      • 我把这些字符串一行一行的放在这里,但是我之前说过这是一个熊猫系列(每一行都是单独的行),那么使用'\n'有什么意义呢?跨度>
      • 您可以忽略它,因为它仅用于拆分StringIO 对象,因为我没有将您的数据放在单独的文件中。
      【解决方案3】:

      也许如果您订购它们(对单词进行排序并删除重复项(如果有的话)),它们最终会是相同的......

      输入:

      'JavaScript,   Ruby , Python'
      'JavaScript,   Python , Ruby'
      'Python,    Ruby, JavaScript'
       'Matlab, Matlab, Matlab'
       'Java, PHP, Python'
       'Matlab, Python'
       'C#, JavaScript'
       'Swift, Objective-C, Swift'
       'R, SQL'
      

      代码:

      def sortNames(x):
          names = x.replace("'", "")
          names = names.replace(",", "")
          names = names.split()
          names = sorted(names)
          names = set(names)
          names = list(filter(None, names))
          names = ', '.join(names)
          return names
      
      df['ProgNames'] = df['ProgNames'].apply(lambda x: sortNames(x))
      

      输出:

          ProgNames
      0   Ruby, Python, JavaScript
      1   Ruby, Python, JavaScript
      2   Ruby, Python, JavaScript
      3   Matlab
      4   Python, PHP, Java
      5   Python, Matlab
      6   C#, JavaScript
      7   Swift, Objective-C
      8   R, SQL
      

      【讨论】:

        猜你喜欢
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        • 2016-06-25
        • 2023-04-06
        • 1970-01-01
        • 2016-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多