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

时间:2018-04-18 20:42:54

标签: python python-3.x pandas dataframe

我在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将字符串的末尾添加到此长度?这可能是一种令人费解的方法......

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:7)

在获取列中的最大字符串长度后,您可以使用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 here的来源中,可以看出ljust完全等同于pad side='right',所以请选择更多明确。

答案 2 :(得分: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???