gpt4 book ai didi

python - 基于匹配列的映射值 - Python

转载 作者:行者123 更新时间:2023-12-03 19:22:25 26 4
gpt4 key购买 nike

我想根据两列的匹配方式映射值。例如,下面的 df 包含不同的标签,AB。我想分配一个描述这些标签的新列。这是如何发生的是比较列 Z LZ PZ L 将始终包含 ['X1','X2','X3','X4']。而 Z P 将相应地包含 ['LA','LB','LC','LD']

这些将始终按顺序或倒序排列。如升序表示 X1 对应 LAX2 对应 LB 等。倒序表示 X1对应LDX2对应LC

如果升序我想映射一个R。如果顺序相反,我想映射一个 L

X = ['X1','X2','X3','X4']

R = ['LA','LB','LC','LD']
L = ['LD','LC','LB','LA']

df = pd.DataFrame({
'Period' : [1,1,1,1,1,2,2,2,2,2],
'labels' : ['A','B','A','B','A','B','A','B','A','B'],
'Z L' : [np.nan,np.nan,'X3','X2','X4',np.nan,'X2','X3','X3','X1'],
'Z P' : [np.nan,np.nan,'LC','LC','LD',np.nan,'LC','LC','LB','LA'],
})

df = df.dropna()

这是确定组合的输出数据集。我有一个带有重复组合的大 df,所以我不太关心返回所有这些组合。我主要关心每个 Period 的所有唯一映射值。

   Period labels Z L Z P
2 1 A X3 LC
3 1 B X2 LC
4 1 A X4 LD
6 2 A X2 LC
7 2 B X3 LC
8 2 A X3 LB
9 2 B X1 LA

尝试:

labels = df['labels'].unique().tolist()

I = df.loc[df['labels'] == labels[0]]
J = df.loc[df['labels'] == labels[1]]


I['Map'] = ((I['Z L'].isin(X)) | (I['Z P'].isin(R))).map({True:'R', False:'L'})

J['Map'] = ((J['Z L'].isin(X)) | (J['Z P'].isin(R))).map({True:'R', False:'L'})

如果我从句点和标签中删除重复项,则预期的 df 是:

   Period labels    Map
0 1 A R
1 1 B L
2 2 A L
3 2 B R

最佳答案

这是我的方法:

# the ascending orders
lst1,lst2 = ['X1','X2','X3','X4'], ['LA','LB','LC','LD']

# enumerate the orders
d1, d2 = ({v:k for k,v in enumerate(l)} for l in (lst1, lst2))

# check if the enumerations in `Z L` and `Z P` are the same
df['Map'] = np.where(df['Z L'].map(d1)== df['Z P'].map(d2), 'R', 'L')

输出:

   Period labels Z L Z P Map
2 1 A X3 LC R
3 1 B X2 LC L
4 1 A X4 LD R
6 2 A X2 LC L
7 2 B X3 LC R
8 2 A X3 LB L
9 2 B X1 LA R

df.drop_duplicates(['Period', 'labels']):

   Period labels Z L Z P Map
2 1 A X3 LC R
3 1 B X2 LC L
6 2 A X2 LC L
7 2 B X3 LC R

关于python - 基于匹配列的映射值 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59168805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com