首页 > 解决方案 > 逐行修改 pandas DataFrame 中的字符串

问题描述

我在 Python3 的 pandas DataFrame 中有以下字符串,列string1string2

import pandas as pd

datainput = [
    { 'string1': 'TTTABCDABCDTTTTT', 'string2': 'ABABABABABABABAA' },
    { 'string1': 'AAAAAAAA', 'string2': 'TTAAAATT' },
    { 'string1': 'TTABCDTTTTT', 'string2': 'ABABABABABA' }
]

df = pd.DataFrame(datainput)

df
            string1           string2
0  TTTABCDABCDTTTTT  ABABABABABABABAA
1          AAAAAAAA          TTAAAATT
2       TTABCDTTTTT       ABABABABABA

对于每一行,列中的字符串string1string2被定义为相同的长度。

对于 DataFrame 的每一行,可能需要“清除”字符串的开头/结尾字母“T”。但是,对于每一行,字符串都需要去除相同数量的字符,以便字符串保持相同的长度。

正确的输出如下:

df
            string1           string2
0          ABCDABCD      BABABABA
1          AAAA          AAAA
2          ABCD          ABAB

如果这是两个变量,那么用 来计算会很简单strip(),例如

string1 = "TTTABCDABCDTTTTT"
string2 = "ABABABABABABABAA"

length_original = len(string1)
num_left_chars = len(string1) - len(string1.lstrip('T'))
num_right_chars = len(string1.rstrip('T'))
edited = string1[num_left_chars:num_right_chars]
## print(edited)
## 'ABCDABCD'

但是,在这种情况下,需要遍历所有行并一次重新定义两行。如何逐行修改这些字符串?

编辑:我的主要困惑是,鉴于两列都可以T,我该如何重新定义它们?

标签: pythonstringpandasstrip

解决方案


raw_data = {'name': ['Will Morris', 'Alferd Hitcock', 'Sir William', 'Daniel Thomas'],
                'age': [11, 49, 66, 77],
                'color': ['TblueT', 'redT', 'white', "cyan"],
                'marks': [74, 90, 44, 17]}
df = pd.DataFrame(raw_data, columns = ['name', 'age', 'color', 'grade'])
print(df)
cols =  ['name','color']
print("new df")
#following line does the magic 

df[cols] = df[cols].apply(lambda row: row.str.lstrip('T').str.rstrip('T'), axis=1)
print(df)

将打印

               name  age   color  grade
0  TWillard MorrisT   20  TblueT     88
1       Al Jennings   19    redT     92
2      Omar Mullins   22  yellow     95
3  Spencer McDaniel   21   green     70

new df

               name  age   color  grade
0    Willard Morris   20    blue     88
1       Al Jennings   19     red     92
2      Omar Mullins   22  yellow     95
3  Spencer McDaniel   21   green     70

推荐阅读