【问题标题】:Better solution for Python PandasPython Pandas 的更好解决方案
【发布时间】:2020-09-07 13:06:37
【问题描述】:

所以我有 2 列,我想根据第二列的值创建第三列。我想从一个文本和一个数字开始,比如说 B0292,如果该列的第二个值保持不变,我在新列中的数字将保持不变。如果号码发生变化,那么我的号码将增加一。喜欢B0293。

d = {'col1': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ], 'col2': ['200', '200', '201', '201', '201', '201', '210', '210', '250', '251']}
df = pd.DataFrame(data=d)
df

桌子:

    col1    col2
0   a   200
1   b   200
2   c   201
3   d   201
4   e   201
5   f   201
6   g   210
7   h   210
8   i   250
9   j   251

我想要的结果:

col1    col2    New Calculated Column
0   a   200 B0292 - 200
1   b   200 B0292 - 200
2   c   201 B0293 - 201
3   d   201 B0293 - 201
4   e   201 B0293 - 201
5   f   201 B0293 - 201
6   g   210 B0294 - 210
7   h   210 B0294 - 210
8   i   250 B0295 - 250
9   j   251 B0296 - 251

我已经用下面的代码解决了这个问题,但我想知道是否有更好的 pandas/numpy 解决方案。

df['New Calculated Column'] = ''
a = 291
b = 0
for number in df.col2:
    if number != df.iloc[b-1,1]:
        a += 1    
    df['New Calculated Column'].iloc[(b)] = 'B0' + str(a) + ' - ' + df.iloc[b,1]
    if b < 9:
        b += 1

【问题讨论】:

    标签: python pandas function numpy


    【解决方案1】:

    假设您的字符串从第二个位置开始有数字,您可以尝试series.factorize 进行字符串切片和添加系列:

    s = "B0292"
    s1 = s[0] + pd.Series(int(s[1:]) + df['col2'].factorize()[0],dtype=str)
    df['New'] = df['col2'].radd(s1+'-')
    

    print(df)
    
      ccol1 col2       New
    0    a  200  B292-200
    1    b  200  B292-200
    2    c  201  B293-201
    3    d  201  B293-201
    4    e  201  B293-201
    5    f  201  B293-201
    6    g  210  B294-210
    7    h  210  B294-210
    8    i  250  B295-250
    9    j  251  B296-251
    

    【讨论】:

    • 是的。这是一个更好的解决方案。谢谢
    • 我的真实数据中出现此错误,我无法找出原因。 'TypeError: can only concatenate str (not "float") to str' df.dtypes 将列显示为对象,所以一切都是 str
    • 没有 nan 值。我尝试使用 fillna 和 .apply(str) 到 df.col2
    • @Mike 你试过df['New'] = df['col2'].fillna('').radd(s1+'-') 吗?
    • 所以更新了。我使用的 df 是另一个 df 的子 df,索引被弄乱了。当我使用.reset_index(drop=True) 重置索引时,@anky 提供的代码有效。所以问题出在索引上。
    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2014-07-20
    • 2011-11-21
    • 1970-01-01
    相关资源
    最近更新 更多