【发布时间】:2020-07-08 21:53:21
【问题描述】:
我有一列(系列)值,我正在尝试移动字符,但我无处可去!我发现了一些 sn-ps 代码可以让我到达我所在的位置,但需要“更接近”。我正在使用一列数据类型(STR)。每列字符串都是一系列数字。有些是重复的。这些重复的数字在数字前面有一个 (n-)。 (n) 数字将根据列出的重复数字字符串的数量而变化。有些可能有两个重复,有些可能有八个重复。没关系,顺序应该保持不变。
我需要遍历每个单元格或字符串,从字符串左侧拔出 (n-),交换两个字符,并将其附加到字符串的末尾。无需数字排序。该列有 4 到 5k 行长,看起来就像下面给出的示例。没有其他特殊字符或字母。此外,无论列中的哪个位置,重复的行都将始终在一起。
我的问题是下面的代码实际上是有效的,它将逐步遍历每个字符串,评估它是否为破折号,然后以我需要的方式处理数字。但是,我还没有学会如何将更改从 python for 循环返回到我的数据框中。我真的希望有人有一个漂亮的 lambda 修复或 pandas 应用函数来一次解决整个专栏。但我还没有找到任何可以调整的东西。我知道有一个比慢慢遍历系列更好的方法,我想学习。
需要两个可能的修复:
- 有没有办法让下面的代码用新创建的 df.string 值替换旧的 df.string 值?如果有,请告诉我。
- 我一直在尝试使用拆分功能阅读 df.apply,以便一次解决整个专栏。我知道这是更聪明的游戏。有几行代码可以满足我的需要吗?
请告诉我你的想法。我很感激帮助。感谢您抽出宝贵时间。
import re
import pandas as pd
from pandas import DataFrame, Series
import numpy as np
df = pd.read_excel("E:\Book2.xlsx")
df.column1=df.column1.astype(str)
for r in df['column1']: #Finds Column
if bool(re.search('-', r))!=True: #test if string has '-'
continue
else:
a = [] #string holder for '-'
b = [] #string holder for numbers
for c in r:
if c == '-': #if '-' then hold in A
a.append(c)
else:
b.append(c) #if number then hold in B
t = (''.join(b + a)) #puts '-' at the end of string
z = t[1:] + t[:1] #picks up 1st position char and moves to end of string
r = z #assigns new created string to df.column1 value
print(df)
Starting File: Ending File:
column1 column1
41887 41887
1-41845 41845-1
2-41845 41845-2
40905 40905
1-41323 41323-1
2-41323 41323-2
3-41323 41323-3
41778 41778
【问题讨论】:
标签: python pandas lambda apply