将六位数的数字列拆分为一个数字的分隔列

msa*_*m85 6 python numpy pandas

如何通过使用pandas或numpy将一列6个整数数字分成6列,每列一个数字?

import pandas as pd
import numpy as np

df = pd.Series(range(123456,123465))

df = pd.DataFrame(df)


df.head()
Run Code Online (Sandbox Code Playgroud)

我所拥有的就是这样的下面

Number
654321
223344
Run Code Online (Sandbox Code Playgroud)

预期的结果应该像下面这样。

Number | x1 | x2 | x3 | x4 | x5 | x6 |
654321 |  6 |  5 | 4  |  3 |  2 |  1 |
223344 |  2 |  2 | 3  |  3 |  4 |  4 |
Run Code Online (Sandbox Code Playgroud)

jla*_*rcy 8

MCVE

这是一个简单的建议:

import pandas as pd

# MCVE dataframe:
df = pd.DataFrame([123456, 456789, 135797, 123, 123456789], columns=['number'])

def digit(x, n):
    """Return the n-th digit of integer in base 10"""
    return (x // 10**n) % 10

def digitize(df, key, n):
    """Extract n less significant digits from an integer in base 10"""
    for i in range(n):
        df['x%d' % i] = digit(df[key], n-i-1)

# Apply function on dataframe (inplace):
digitize(df, 'number', 6)
Run Code Online (Sandbox Code Playgroud)

对于试验数据框,它返回:

      number  x0  x1  x2  x3  x4  x5
0     123456   1   2   3   4   5   6
1     456789   4   5   6   7   8   9
2     135797   1   3   5   7   9   7
3        123   0   0   0   1   2   3
4  123456789   4   5   6   7   8   9
Run Code Online (Sandbox Code Playgroud)

观察结果

这种方法避免了需要投进去string,然后再转换为int

它依赖于模块化整数算术,其操作细节如下:

10**3                  # int: 1000 (integer power)
54321 // 10**3         # int: 54   (quotient of integer division)
(54321 // 10**3) % 10  # int: 4    (remainder of integer division, modulo)
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的一点是,它对于小于n或大于数字的数字是安全且准确的(请注意,n在后一种情况下,它将返回较低的有效数字)。