【问题标题】:Concatenate columns with specific width integers连接具有特定宽度整数的列
【发布时间】:2018-05-31 12:53:57
【问题描述】:

我有一个包含两个整数列的数据框“df”:

C1 C2
8  49
.. ..

据此,我想创建一个新列,将具有特定宽度的两列连接起来。 C1 应为两位宽,C2 应为三位宽,因此结果列如下所示:

CODESUM 
08049

前 0 对我来说不太重要。

到目前为止,我已经尝试将str() 函数与str(df.C1) 一起使用,但没有成功。还有其他想法吗?

【问题讨论】:

    标签: python string pandas dataframe


    【解决方案1】:

    使用双重str.zfill

    df['new'] = df.C1.astype(str).str.zfill(2) + df.astype(str).C2.str.zfill(3)
    

    【讨论】:

    • 非常感谢,这很有魅力!是否有可能将结果另存为同一数据框中的新列?当 df.head() :(
    • 没有名为new的新列?
    • Nope :( 也许我在打开它的时候需要设置一些东西?我用的是:pd.read_csv('file.csv')
    • @Unicoln - 创建DataFrame 的正确方法。如果在我的代码之后测试print (df.columns),返回什么?
    • 我得到了所有的列标题,但仍然没有'新'
    【解决方案2】:

    您可以简单地尝试以下方法:

    df['CODESUM'] = df['C1'].astype(str).str.zfill(1) + df['C2'].astype(str).str.zfill(2)
    

    "+" 适用于 str 连接

    【讨论】:

    • 谢谢大卫!也很快:)
    【解决方案3】:

    使用列表理解和格式化字符串(Python 3.6+):

    df['new'] = [f'{i:02d}{j:03d}' for i, j in df[['C1', 'C2']].values]
    
    print(df)
    
       C1  C2    new
    0   8  49  08049
    

    F 字符串通常可以提高性能:

    df = pd.concat([df]*100000)
    
    %timeit [f'{i:02d}{j:03d}' for i, j in df[['C1', 'C2']].values]               # 458ms / loop
    %timeit [str(i).zfill(2)+str(j).zfill(3) for i, j in df[['C1', 'C2']].values] # 1.03s / loop
    %timeit df.C1.astype(str).str.zfill(2) + df.astype(str).C2.str.zfill(3)       # 1.02s / loop
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2020-02-05
      相关资源
      最近更新 更多