如何在pandas DataFrame中标准化行之间的字符串?

4
我在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

有两列,IDpattern。第一行中,pattern 中最长的字符串是 '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? 这可能是一种复杂的方法...
3个回答

9
你可以使用 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.0 这里可以看到,ljust与使用参数side ='right'pad完全等效,因此选择你认为更清晰的一个。

我以前从未听说过 Series.str.ljust()。谢谢你告诉我! - ShanZhengYang
@ShanZhengYang 不用担心。文档中有很多相关内容,请查看字符串处理 - miradulo

8
你可以使用 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-string

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是做什么用的吗? - Subham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接