根据 Pandas 中两列之间的匹配查找值
Look up values based on match between two columns in Pandas
我有这个数据
import pandas as pd
data = {'Code': ['20','22','21','21','21','21','20','20','20','20'],
'Code2': ['1', '5', '2', '', '2', '2', '1', '', '1', '1']}
df = pd.DataFrame (data, columns = ['Code','Code2'])
Code Code2
0 20 1
1 22 5
2 21 2
3 21
4 21 2
5 21 2
6 20 1
7 20
8 20 1
9 20 1
我正在尝试根据之前的关联来填充 Code2
中的缺失值。所以,我知道当Code
为20时,Code2
为1,当Code
为21时,Code2
为2。
我的输出应该是这样的:
Code Code2
0 20 1
1 22 5
2 21 2
3 21 2
4 21 2
5 21 2
6 20 1
7 20 1
8 20 1
9 20 1
我想我可以使用一些连接来做到这一点,但如果可能的话我会热衷于使用一个衬垫。
您可以使用 groupby.ffill
:
df['Code2'] = df.Code2.replace('',np.nan).groupby(df.Code).ffill()
输出:
Code Code2
0 20 1
1 22 5
2 21 2
3 21 2
4 21 2
5 21 2
6 20 1
7 20 1
8 20 1
9 20 1
使用drop_duplicates
和map
:
data = {'Code': ['20','22','21','21','21','21','20','20','20','20'],
'Code2': ['1', '5', '2', '', '2', '2', '1', '', '1', '1']}
df = pd.DataFrame (data, columns = ['Code','Code2'])
m = df.drop_duplicates('Code').set_index('Code')['Code2']
df['Code2'] = df['Code'].map(m)
df
输出:
Code Code2
0 20 1
1 22 5
2 21 2
3 21 2
4 21 2
5 21 2
6 20 1
7 20 1
8 20 1
9 20 1
使用 groupby
并使用 first
:
转换列 Code2
df['Code2'] = df['Code2'].replace('', np.nan).groupby(df['Code']).transform('first')
结果:
Code Code2
0 20 1
1 22 5
2 21 2
3 21 2
4 21 2
5 21 2
6 20 1
7 20 1
8 20 1
9 20 1
我有这个数据
import pandas as pd
data = {'Code': ['20','22','21','21','21','21','20','20','20','20'],
'Code2': ['1', '5', '2', '', '2', '2', '1', '', '1', '1']}
df = pd.DataFrame (data, columns = ['Code','Code2'])
Code Code2
0 20 1
1 22 5
2 21 2
3 21
4 21 2
5 21 2
6 20 1
7 20
8 20 1
9 20 1
我正在尝试根据之前的关联来填充 Code2
中的缺失值。所以,我知道当Code
为20时,Code2
为1,当Code
为21时,Code2
为2。
我的输出应该是这样的:
Code Code2
0 20 1
1 22 5
2 21 2
3 21 2
4 21 2
5 21 2
6 20 1
7 20 1
8 20 1
9 20 1
我想我可以使用一些连接来做到这一点,但如果可能的话我会热衷于使用一个衬垫。
您可以使用 groupby.ffill
:
df['Code2'] = df.Code2.replace('',np.nan).groupby(df.Code).ffill()
输出:
Code Code2
0 20 1
1 22 5
2 21 2
3 21 2
4 21 2
5 21 2
6 20 1
7 20 1
8 20 1
9 20 1
使用drop_duplicates
和map
:
data = {'Code': ['20','22','21','21','21','21','20','20','20','20'],
'Code2': ['1', '5', '2', '', '2', '2', '1', '', '1', '1']}
df = pd.DataFrame (data, columns = ['Code','Code2'])
m = df.drop_duplicates('Code').set_index('Code')['Code2']
df['Code2'] = df['Code'].map(m)
df
输出:
Code Code2
0 20 1
1 22 5
2 21 2
3 21 2
4 21 2
5 21 2
6 20 1
7 20 1
8 20 1
9 20 1
使用 groupby
并使用 first
:
Code2
df['Code2'] = df['Code2'].replace('', np.nan).groupby(df['Code']).transform('first')
结果:
Code Code2
0 20 1
1 22 5
2 21 2
3 21 2
4 21 2
5 21 2
6 20 1
7 20 1
8 20 1
9 20 1