使用Pandas拆分数字并为每个数字拆分创建新的单独列

时间:2018-06-13 08:18:32

标签: python pandas numpy dataframe data-structures

美好的一天,

我有一个像这样的列的数据框,让我们假设有1000个,但这是一个示例:

 A    B    C
12    1    2
24    2    4
36    3    6
48    4    8

我希望将数字分成两个单独的数字。我希望输出看起来像这样:

Phone Number

如何使用Pandas和Numpy实现这一目标?真的很感激帮助。 提前谢谢!

4 个答案:

答案 0 :(得分:3)

使用floormod

df['B'] = df['A'] // 10
df['C'] = df['A'] % 10

print (df)
    A  B  C
0  12  1  2
1  24  2  4
2  36  3  6
3  48  4  8

如果输入数据是字符串,则可以按位置按[]索引:

print (df['A'].apply(type))
0    <class 'str'>
1    <class 'str'>
2    <class 'str'>
3    <class 'str'>
Name: A, dtype: object

df['B'] = df['A'].str[0]
df['C'] = df['A'].str[1]
#if necessary convert all columns to integers
df = df.astype(int)
print (df)
    A  B  C
0  12  1  2
1  24  2  4
2  36  3  6
3  48  4  8

答案 1 :(得分:3)

对于大小使用floordivmod

的df
In[141]:
df['B'] = df['A'].floordiv(10)
df['C'] = df['A'].mod(10)
df

Out[141]: 
    A  B  C
0  12  1  2
1  24  2  4
2  36  3  6
3  48  4  8

还有numpy个,np.floor_dividenp.mod

In[142]:
df['B'] = np.floor_divide(df['A'],10)
df['C'] = np.mod(df['A'],10)
df

Out[142]: 
    A  B  C
0  12  1  2
1  24  2  4
2  36  3  6
3  48  4  8

numpy版本更快:

%%timeit
df['B'] = df['A'].floordiv(10)
df['C']= df['A'].mod(10)
1000 loops, best of 3: 733 µs per loop

%%timeit
df['B'] = np.floor_divide(df['A'],10)
df['C'] = np.mod(df['A'],10)

1000 loops, best of 3: 491 µs per loop

答案 2 :(得分:2)

In [15]: df.A.astype(str).str.extractall(r'(.)')[0].unstack().astype(np.int8)
Out[15]:
match  0  1
0      1  2
1      2  4
2      3  6
3      4  8

答案 3 :(得分:2)

另一种基于分割被视为字符串的数字的每个字符的方法:

df = pd.DataFrame([12, 24, 36, 48], columns=['A'])

values = df['A'].values
split = [list(str(el)) for el in values]

out = pd.DataFrame(split, columns=['B', 'C']).astype(int)

给出:

out
   B  C
0  1  2
1  2  4
2  3  6
3  4  8