pandas 更改字符串或列表中的第一个和最后一个元素

velaa5lx  于 6个月前  发布在  其他
关注(0)|答案(5)|浏览(73)

我有一个这样的数据框:

data = {
    'name': ['101 blueberry 2023', '102 big cat 2023', '103 small white dog 2023'],
    'number': [116, 118, 119]}
df = pd.DataFrame(data)
df

字符串
产出:

name  number          
0        101 blueberry 2023     116         
1          102 big cat 2023     118           
2  103 small white dog 2023     119


我想更改name列中的第一个和最后一个数字。例如,name中的第一个数字为number列中的数字,而name中的最后一个数字为'2024'。因此,最后它看起来像:

name  number   
0        116 blueberry 2024     116          
1          118 big cat 2024     118          
2  119 small white dog 2024     119


我尝试将name拆分为一个列表,并更改列表的第一个和最后一个元素。

df['name_pieces'] = df['name'].split(' ')
df


产出:

name  number                     name_pieces
0        101 blueberry 2023     116          [101, blueberry, 2023]
1          102 big cat 2023     118           [102, big, cat, 2023]
2  103 small white dog 2023     119  [103, small, white, dog, 2023]


我可以使用.str访问列表的第一项,但不能更改该项。

df['name_pieces'].str[0]


产出:

0    101
1    102
2    103


但尝试分配列表的第一个值时会出现错误

df['name_pieces'].str[0] = df['number']


产出:

TypeError: 'StringMethods' object does not support item assignment


如何替换name的第一个和最后一个值?

zbq4xfa0

zbq4xfa01#

不要为列表而烦恼,你可以只提取你想要的字符串的一部分,然后连接其他部分。

df.assign(name=
    df['number'].astype(str)
    + df['name'].str.extract(r'( .* )', expand=False)
    + '2024'
)

个字符
这个正则表达式获取字符串中被空格包围的最长部分,即第一个空格和最后一个空格之间的部分。
如果你更愿意主要考虑name,这里有一个变体:

df.assign(name=
    df['name'].str.extract(r'( .* )', expand=False)
    .radd(df['number'].astype(str))
    .add('2024')
)

t5fffqht

t5fffqht2#

尝试:

df["name_pieces"] = df.apply(
    lambda x: [x["number"], *x["name_pieces"][1:-1], 2024], axis=1
)
print(df)

字符串
印刷品:

name  number                     name_pieces
0        101 blueberry 2023     116          [116, blueberry, 2024]
1          102 big cat 2023     118           [118, big, cat, 2024]
2  103 small white dog 2023     119  [119, small, white, dog, 2024]

eanckbw9

eanckbw93#

使用单个正则表达式替换,无需初始化.str.split(' '),也无需使用df.apply

df['name_pieces'] = (
    df['number'].astype(str)
    + df['name'].str.replace(r'^(\d+)(.+) \d+$', r'\2 2024', regex=True))

个字符

4nkexdtk

4nkexdtk4#

验证码

使用replace和regex

df['name'] = df['name'].replace({'^\d+':'', '2023$':'2024'}, regex=True)\
                       .radd(df['number'].astype('str'))

字符串
df

name                        number
0   116 blueberry 2024          116
1   118 big cat 2024            118
2   119 small white dog 2024    119

0s0u357o

0s0u357o5#

另一种可能的解决方案,基于pandas.Series.str.split将列name拆分为第一个空格(n=1):

(df.assign(name = df['number'].astype('str').add(' ')
           .add(df['name'].str.split('\s', n=1, expand=True)[1])
           .str.replace('\d+$', '2024', regex=True)))

字符串
输出量:

name  number
0        116 blueberry 2024     116
1          118 big cat 2024     118
2  119 small white dog 2024     119

相关问题