【问题标题】:How to standardize strings between rows in a pandas DataFrame?如何标准化 pandas DataFrame 中行之间的字符串?
【发布时间】:2018-04-18 20:42:54
【问题描述】:

我在 Python3.x 中有以下 pandas DataFrame:

import pandas as pd

dict1 = {
    'ID':['first', 'second', 'third', 'fourth', 'fifth'], 
    'pattern':['AAABCDEE', 'ABBBBD', 'CCCDE', 'AA', 'ABCDE']
}

df = pd.DataFrame(dict1)

>>> df
       ID   pattern
0   first  AAABCDEE
1  second    ABBBBD
2   third     CCCDE
3  fourth        AA
4   fifth     ABCDE

有两列,IDpatternpattern中长度最长的字符串在第一行len('AAABCDEE'),长度为8。

我的目标是标准化字符串,使它们的长度相同,尾随空格为?

下面是输出的样子:

>>> df
       ID   pattern
0   first  AAABCDEE
1  second  ABBBBD?? 
2   third  CCCDE???
3  fourth  AA??????
4   fifth  ABCDE???

如果我能够使尾随空格NaN,那么我可以尝试类似:

df = df.applymap(lambda x: int(x) if pd.notnull(x) else str("?"))

但我不确定如何有效地(1)在pattern 中找到最长的字符串,(2)然后添加NaN 将字符串的末尾添加到这个长度?这可能是一个复杂的方法......

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    在获取列中的最大字符串长度后,您可以为此使用Series.str.ljust

    df.pattern.str.ljust(df.pattern.str.len().max(), '?')
    
    # 0    AAABCDEE
    # 1    ABBBBD??
    # 2    CCCDE???
    # 3    AA??????
    # 4    ABCDE???
    # Name: pattern, dtype: object
    

    在 Pandas 的源代码0.22.0here 中可以看出ljust 完全等同于padside='right',所以选择你觉得更清楚的那个。

    【讨论】:

    • 我从来没有对Series.str.ljust() 感到陌生。谢谢!
    • @ShanZhengYang 不用担心。有一大堆,请参阅文档中的String handling
    【解决方案2】:

    您可以使用str.pad

    df.pattern.str.pad(width=df.pattern.str.len().max(),side='right',fillchar='?')
    Out[1154]: 
    0    AAABCDEE
    1    ABBBBD??
    2    CCCDE???
    3    AA??????
    4    ABCDE???
    Name: pattern, dtype: object
    

    【讨论】:

      【解决方案3】:

      Python 3.6 f 字符串

      n = df.pattern.str.len().max()
      df.assign(pattern=[f'{i:?<{n}s}' for i in df.pattern])
      
             ID   pattern
      0   first  AAABCDEE
      1  second  ABBBBD??
      2   third  CCCDE???
      3  fourth  AA??????
      4   fifth  ABCDE???
      

      【讨论】:

      • 你能解释一下 f-string 在这里做什么..
      猜你喜欢
      • 2012-07-06
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      相关资源
      最近更新 更多