如何在 Python Pandas 中的数组、列表或数据帧中的每个单个数字元素的末尾附加 1?
How to append a 1 to the end of each single digit element within an array, list, or dataframe in Python Pandas?
我发现用数组很难做到这一点,但无论哪种输出方法都适合我。
我想从我的 DataFrame 中取出一列,其中包含一位数和两位数。
这些项目目前是整数,但可以将它们转换为 str
或 bool
,执行任务所需的任何内容。
我想在所有个位数的末尾添加一个1
例如,如果第一个数字是2
,那么我希望它是return 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].
假设您的数据是数字。您可以使用 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
>>> 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
我会这样做:
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))
因此,如果 a < 10,b 就是 a,否则就是整数除以 10 的结果。请注意,numpy 数组支持整数除法,而 pandas 系列不支持(据我所知),这就是为什么我有 col.a.values / 10
。对于 c 列,如果 a < 10 则为 1,否则为 mod 10。
我发现用数组很难做到这一点,但无论哪种输出方法都适合我。
我想从我的 DataFrame 中取出一列,其中包含一位数和两位数。
这些项目目前是整数,但可以将它们转换为 str
或 bool
,执行任务所需的任何内容。
我想在所有个位数的末尾添加一个1
例如,如果第一个数字是2
,那么我希望它是return 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].
假设您的数据是数字。您可以使用 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
>>> 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
我会这样做:
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))
因此,如果 a < 10,b 就是 a,否则就是整数除以 10 的结果。请注意,numpy 数组支持整数除法,而 pandas 系列不支持(据我所知),这就是为什么我有 col.a.values / 10
。对于 c 列,如果 a < 10 则为 1,否则为 mod 10。