从另一个数据框的选定列中填充 NaN 值
fill NaN values from selected columns of another dataframe
我有这样的 df1
id name level personality type weakness atk def hp stage
0 53.0 Persian 40.0 mild normal fighting 104.0 116.0 NaN 2.0
1 126.0 Magmar 44.0 docile NaN water 96.0 83.0 153.0 1.0
2 57.0 Primeape 9.0 lonely fighting flying NaN 66.0 43.0 2.0
3 3.0 Venusaur 44.0 sassy grass fire 136.0 195.0 92.0 3.0
4 11.0 Metapod 4.0 naive grass fire NaN 114.0 NaN 2.0
5 126.0 Magmar 96.0 modest fire water 62.0 114.0 NaN 1.0
6 137.0 Porygon 96.0 relaxed NaN fighting 68.0 50.0 127.0 1.0
7 69.0 Bellsprout 84.0 lonely grass fire NaN NaN NaN 1.0
8 10.0 Caterpie 3.0 serious NaN flying NaN NaN 15.0 1.0
9 12.0 Butterfree 12.0 hasty NaN flying 20.0 NaN NaN 3.0
10 35.0 Clefairy 18.0 impish fairy poison 33.0 NaN NaN 1.0
11 59.0 Arcanine 35.0 gentle fire water 45.0 60.0 80.0 2.0
12 111.0 Rhyhorn 31.0 naughty rock water 40.0 NaN 175.0 1.0
13 136.0 Flareon 75.0 bold NaN water NaN 143.0 NaN 2.0
14 51.0 Dugtrio 82.0 gentle ground water 152.0 161.0 168.0 2.0
15 38.0 Ninetales 5.0 brave fire water NaN 179.0 173.0 2.0
16 102.0 Exeggcute 88.0 rash NaN fire NaN 124.0 NaN 1.0
........
和 df2 为
weakness type count
3 fire grass 11
10 water fire 9
0 fighting normal 6
4 flying fighting 3
8 poison fairy 3
6 grass water 1
9 rock fire 1
7 ground electric 1
我想使用 df2 更新类型列中的 NaN 值,并在两个 df 中匹配弱点列。例如,在 df1 的第 8 行和第 9 行中,'type' 值为 NaN。我想用 df2 更新它们匹配 df1 中的弱点列。所以那些 8,9 类型值应该是 'fighting' 等。这有点像 df2 和 df1 之间的一对多关系。
我试过了
df1.update(df2)
和
df1.fillna(df2)
但是他们没有给出想要的输出。任何帮助将不胜感激。
从 df2
创建一个系列,它将 weakness
值映射到 type
值:
mapping = df2.set_index("weakness")["type"]
map df1["weakness"]
使用此映射创建默认值:
defaults = df1["weakness"].map(mapping)
使用默认值作为 fillna
方法的参数:
df1["type"] = df1["type"].fillna(defaults)
您可以从 df2 创建一个字典,以 weakness 列作为键,type 列作为它们各自的值,然后使用该字典 fillna
df1 中的 type 列,使用 map
:
m = dict(zip(df2.weakness,df2.type))
df1.type = df1.type.fillna(df1.weakness.map(m))
打印:
>>> df1[['weakness','type']]
weakness type
0 fighting normal
1 water fire
2 flying fighting
3 fire grass
4 fire grass
5 water fire
6 fighting normal
7 fire grass
8 flying fighting
9 flying fighting
10 poison fairy
11 water fire
12 water rock
13 water fire
14 water ground
15 water fire
16 fire grass
内联记录的代码
# Merge both dataframes using "weakness" as key
df = pd.merge(df1, df2[['weakness', 'type']],
on="weakness", suffixes=("", "_y"), how="left")
# Replace nans
df['type'].fillna(df['type_y'], inplace=True)
# Drop additional columns resulted from Merge
df.drop(columns=['type_y'])
我有这样的 df1
id name level personality type weakness atk def hp stage
0 53.0 Persian 40.0 mild normal fighting 104.0 116.0 NaN 2.0
1 126.0 Magmar 44.0 docile NaN water 96.0 83.0 153.0 1.0
2 57.0 Primeape 9.0 lonely fighting flying NaN 66.0 43.0 2.0
3 3.0 Venusaur 44.0 sassy grass fire 136.0 195.0 92.0 3.0
4 11.0 Metapod 4.0 naive grass fire NaN 114.0 NaN 2.0
5 126.0 Magmar 96.0 modest fire water 62.0 114.0 NaN 1.0
6 137.0 Porygon 96.0 relaxed NaN fighting 68.0 50.0 127.0 1.0
7 69.0 Bellsprout 84.0 lonely grass fire NaN NaN NaN 1.0
8 10.0 Caterpie 3.0 serious NaN flying NaN NaN 15.0 1.0
9 12.0 Butterfree 12.0 hasty NaN flying 20.0 NaN NaN 3.0
10 35.0 Clefairy 18.0 impish fairy poison 33.0 NaN NaN 1.0
11 59.0 Arcanine 35.0 gentle fire water 45.0 60.0 80.0 2.0
12 111.0 Rhyhorn 31.0 naughty rock water 40.0 NaN 175.0 1.0
13 136.0 Flareon 75.0 bold NaN water NaN 143.0 NaN 2.0
14 51.0 Dugtrio 82.0 gentle ground water 152.0 161.0 168.0 2.0
15 38.0 Ninetales 5.0 brave fire water NaN 179.0 173.0 2.0
16 102.0 Exeggcute 88.0 rash NaN fire NaN 124.0 NaN 1.0
........
和 df2 为
weakness type count
3 fire grass 11
10 water fire 9
0 fighting normal 6
4 flying fighting 3
8 poison fairy 3
6 grass water 1
9 rock fire 1
7 ground electric 1
我想使用 df2 更新类型列中的 NaN 值,并在两个 df 中匹配弱点列。例如,在 df1 的第 8 行和第 9 行中,'type' 值为 NaN。我想用 df2 更新它们匹配 df1 中的弱点列。所以那些 8,9 类型值应该是 'fighting' 等。这有点像 df2 和 df1 之间的一对多关系。
我试过了
df1.update(df2)
和
df1.fillna(df2)
但是他们没有给出想要的输出。任何帮助将不胜感激。
从
df2
创建一个系列,它将weakness
值映射到type
值:mapping = df2.set_index("weakness")["type"]
map
df1["weakness"]
使用此映射创建默认值:defaults = df1["weakness"].map(mapping)
使用默认值作为
fillna
方法的参数:df1["type"] = df1["type"].fillna(defaults)
您可以从 df2 创建一个字典,以 weakness 列作为键,type 列作为它们各自的值,然后使用该字典 fillna
df1 中的 type 列,使用 map
:
m = dict(zip(df2.weakness,df2.type))
df1.type = df1.type.fillna(df1.weakness.map(m))
打印:
>>> df1[['weakness','type']]
weakness type
0 fighting normal
1 water fire
2 flying fighting
3 fire grass
4 fire grass
5 water fire
6 fighting normal
7 fire grass
8 flying fighting
9 flying fighting
10 poison fairy
11 water fire
12 water rock
13 water fire
14 water ground
15 water fire
16 fire grass
内联记录的代码
# Merge both dataframes using "weakness" as key
df = pd.merge(df1, df2[['weakness', 'type']],
on="weakness", suffixes=("", "_y"), how="left")
# Replace nans
df['type'].fillna(df['type_y'], inplace=True)
# Drop additional columns resulted from Merge
df.drop(columns=['type_y'])