Ich habe die folgenden Pandas DataFrame in Python3.x:

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

Es gibt zwei Spalten, ID und pattern. Die Zeichenfolge in pattern mit der längsten Länge befindet sich in der ersten Zeile len('AAABCDEE') mit der Länge 8.

Mein Ziel ist es, die Zeichenfolgen so zu standardisieren, dass sie dieselbe Länge haben und die Leerzeichen nach ? stehen.

So sollte die Ausgabe aussehen:

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

Wenn ich die nachgestellten Leerzeichen NaN erstellen könnte, könnte ich Folgendes versuchen:

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

Aber ich bin mir nicht sicher, wie man effizient (1) die längste Zeichenfolge in pattern finden und (2) dann NaN hinzufügen und das Ende der Zeichenfolgen bis zu dieser Länge hinzufügen kann? Dies kann ein komplizierter Ansatz sein ...

4
ShanZhengYang 18 Apr. 2018 im 23:42

3 Antworten

Beste Antwort

Sie können Series.str.ljust, nachdem Sie die maximale Zeichenfolgenlänge in der Spalte ermittelt haben.

df.pattern.str.ljust(df.pattern.str.len().max(), '?')

# 0    AAABCDEE
# 1    ABBBBD??
# 2    CCCDE???
# 3    AA??????
# 4    ABCDE???
# Name: pattern, dtype: object

In der Quelle für Pandas 0.22.0 hier ist zu sehen, dass ljust mit side='right' völlig gleichbedeutend mit pad ist. Wählen Sie also das aus, was Sie klarer finden.

7
miradulo 18 Apr. 2018 im 21:12

Sie können str.pad verwenden

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
8
YOBEN_S 18 Apr. 2018 im 20:44

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???

3
piRSquared 18 Apr. 2018 im 22:07