如何在Python Pandas中的数组,列表或数据框中的每个单个数字元素的末尾附加1?

时间:2015-07-23 19:20:05

标签: python arrays pandas append dataframe

我发现使用数组很难做到这一点,但无论输出方法如何都适合我。 我想从我的DataFrame中取一个列,它有一位数字和两位数字 这些项目当前是整数,但无论做什么任务都可以转换为strbool

我想在所有单个数字的末尾添加1,例如,如果第一个数字是2,那么我希望它返回21

最后,一旦完成这些操作,我需要将数字分成两半并创建两列。 例如

col['a'] = [3, 22, 23, 2, 1] 

所以我的输出应该是这样的:

col['a'] = [31, 22, 23, 21, 11] 

然后,我很可能会做类似

的事情
col['b'] = col['a'][0:] 
[3,2,2,2,1] 

col['c'] = col['a'][:1] 
[1,2,3,1,1].      

3 个答案:

答案 0 :(得分:3)

假设您的数据是数字。您可以使用np.mod(data, 10)获取最后一位数字。

import pandas as pd
import numpy as np

# data
# ===========================
df = pd.DataFrame({'a': [31, 22, 23, 21, 11]})
df.dtypes

a    int64
dtype: object


# processing
# =====================================
df['c'] = np.mod(df.a, 10)

df
    a  c
0  31  1
1  22  2
2  23  3
3  21  1
4  11  1    

编辑:

在每个单个数字的末尾添加1:

df = pd.DataFrame({'a': [31,22,23,21,11,1,2,3,4,5]})

df

    a
0  31
1  22
2  23
3  21
4  11
5   1
6   2
7   3
8   4
9   5


single_digit_selector = df.a - np.mod(df.a, 10) == 0
df[single_digit_selector] = df[single_digit_selector] * 10 + 1
df

    a
0  31
1  22
2  23
3  21
4  11
5  11
6  21
7  31
8  41
9  51

答案 1 :(得分:2)

>>> df
    a
0   3
1  22
2  23
3   2
4   1

df['aa'] = df.apply(lambda row: row['a']*10+1 if 0<=row['a']<=9 else row['a'], axis=1)

>>> df
    a  aa
0   3  31
1  22  22
2  23  23
3   2  21
4   1  11

df['b'] = df.apply(lambda row: divmod(row['aa'], 10)[0], axis=1)
df['c'] = df.apply(lambda row: divmod(row['aa'], 10)[1], axis=1)

>>> df
    a  aa  b  c
0   3  31  3  1
1  22  22  2  2
2  23  23  2  3
3   2  21  2  1
4   1  11  1  1

答案 2 :(得分:1)

我会这样做:

single_digit = col.a < 10
col['b'] = col.a.where(single_digit, col.a.values / 10)
col['c'] = np.where(single_digit, 1, np.mod(col.a, 10))

所以如果&lt;在图10中,b仅仅是a,否则整数除以10的结果。请注意,numpy数组支持整数除法,而pandas系列则不支持(据我所知)这就是为什么我有col.a.values / 10。对于列c,如果a&lt; 10,否则为mod 10。