我有一个数据框:
import numpy as np
import pandas as pd
arr = np.array([['a', 0, 1.2,12.5,3], ['a',1, 4,5.,6.885],
['a', 2, 2.3,3.133,4.3], ['a', 3, 5.678,6.,7.34556],
['a', 4, 6.5,7,8.1344], ['b',0, 10.7,11.4,12.1332],
['b',1, 14.,15,16.0155], ['b',2, 17.3,18.,9.11],
['b', 3, 22.2, 33.233, 1.2323],
['c', 0, 1.1, 2.2, 3.3],
['c', 1, 2.2, 3.43, 54.5],
['d', 0 , 2.2, 2.2, 3.],
['d',1, 3.4, 4., 5.6],
['d', 2, 3.3, 4, 5.]])
df = pd.DataFrame(arr, columns=['name', 'id', 'x', 'y', 'z'])
df['id'] = pd.to_numeric(df['id'])
df['x'] = pd.to_numeric(df['x'])
df['y'] = pd.to_numeric(df['y'])
df['z'] = pd.to_numeric(df['z'])
df
name id x y z
0 a 0 1.2 12.5 3
1 a 1 4 5.0 6.885
2 a 2 2.3 3.133 4.3
3 a 3 5.678 6.0 7.34556
4 a 4 6.5 7 8.1344
5 b 0 10.7 11.4 12.1332
6 b 1 14.0 15 16.0155
7 b 2 17.3 18.0 9.11
8 b 3 22.2 33.233 1.2323
9 c 0 1.1 2.2 3.3
10 c 1 2.2 3.43 54.5
11 d 0 2.2 2.2 3.0
12 d 1 3.4 4.0 5.6
13 d 2 3.3 4 5.0
我有一个大小相同的数组:
the_array = np.array([['a', 82.365],
['a', 82.365],
['a', 82.365],
['a', 82.365],
['b', 136.879],
['b', 136.879],
['b', 136.879],
['b', 136.879],
[None, None],
[None, None],
[None, None],
[None, None],
[None, None],
[None, None]], dtype=object)
现在,我想在df中创建一个新列,在其中我将根据列thearray
填充name
的值。
我希望df中名称与thearray
中的名称相同的每一行都具有相同的值(与thearray
中的名称相同)。
我想要的结果
name id x y z new_col
0 a 0 1.200 12.500 3.00000 82.365
1 a 1 4.000 5.000 6.88500 82.365
2 a 2 2.300 3.133 4.30000 82.365
3 a 3 5.678 6.000 7.34556 82.365
4 a 4 6.500 7.000 8.13440 82.365
5 b 0 10.700 11.400 12.13320 136.879
6 b 1 14.000 15.000 16.01550 136.879
7 b 2 17.300 18.000 9.11000 136.879
8 b 3 22.200 33.233 1.23230 136.879
9 c 0 1.100 2.200 3.30000 None
10 c 1 2.200 3.430 54.50000 None
11 d 0 2.200 2.200 3.00000 None
12 d 1 3.400 4.000 5.60000 None
13 d 2 3.300 4.000 5.00000 None
我尝试过:
df['new_col'] = np.where(df['name'] == the_array[:, 0], the_array[:, 1], the_array[:, 1])
但我收到了
name id x y z new_col
0 a 0 1.200 12.500 3.00000 82.365
1 a 1 4.000 5.000 6.88500 82.365
2 a 2 2.300 3.133 4.30000 82.365
3 a 3 5.678 6.000 7.34556 82.365
4 a 4 6.500 7.000 8.13440 136.879
5 b 0 10.700 11.400 12.13320 136.879
6 b 1 14.000 15.000 16.01550 136.879
7 b 2 17.300 18.000 9.11000 136.879
8 b 3 22.200 33.233 1.23230 None
9 c 0 1.100 2.200 3.30000 None
10 c 1 2.200 3.430 54.50000 None
11 d 0 2.200 2.200 3.00000 None
12 d 1 3.400 4.000 5.60000 None
13 d 2 3.300 4.000 5.00000 None
答案 0 :(得分:1)
您可以使用Series.map()
进行此操作:
df['new_col'] = df['name'].map({'a': 82.365, 'b': 136.879})
the_array
的大小与df
相同,但未对齐。它似乎代表一组唯一名称的映射name -> value
。因此,应该用dict
而不是array
表示。通过遍历数组行的字典理解很容易构造这个dict
:
the_map = {k: v for k, v in the_array if k}
df['new_col'] = df['name'].map(the_map)
考虑数据的含义以及如何最好地表示它是一种编写精美代码并在这种情况下找到解决方案的好方法。