1

我试图找到一种方法来表示np.where()代码中以外的条件。在我下面的例子中,

import pandas as pd
import numpy as np

file='insert path'
df = pd.read_csv(file)
df.loc[:, ['col_a','col_b']] = df.loc[:, ['col_a','col_b']].astype(str)
dfseg=df['col_a']+'-'+df['col_b']+'-'+df['col_c']

df['col_d'] = np.where((df['col_a']=='101')|(df['col_a']=='337')|(df['col_a']=='524'),dfseg,df['col_a'])

df

条件是

一种。df['col_a']=='101' 或

湾。df['col_a']=='337' 或

C。df['col_a']=='524'

有什么方法可以在代码外部表示这些条件?或者通过另一个python方法/函数?可以tkinter提取这部分代码并编辑这些条件吗?希望找到一种方法可以在外部而不是在脚本内审查和管理这些条件等。

我已经尝试过np.isin()np.in1d但收到了错误的结果:

print(np.in1d(df1['col_a'],df2['col_a']))
print(np.isin(df1['col_a'],df2['col_a']))

输出:

[False False False False False False]
[False False False False False False]

从以下:

df2: 
    col_a
0    101
1    524
2    337 
 df1: 
   col_a col_b col_c
0   101   104   AAB
1   337   103   CAD
2   524   204   DER
3   129   404   EEH
4   842   108   HHR
5   337   108   HHE 
 df2[col_a].isin df1[col_a] 
 0    False
1    False
2    False
3    False
4    False
5    False
Name: col_a, dtype: bool 
 df1[col_a].isin df2[col_a] 
 0    True
1    True
2    True
Name: col_a, dtype: bool

将df转换为numpy

df1numpy = df1.to_numpy()

同样产生了所有“假”匹配np.isin()。谢谢你的想法。

4

1 回答 1

1

事实证明,将 df 转换为 numpy 后,还需要转置数组:

df1numpy1stcol = np.transpose(df1numpy)[0]

(df2不需要转换成numpy,下面更新)。

然后,从对象更改数据类型:

df1numpy1stcol.astype(np.int32)

最后,np.where()可以与 一起使用np.isin()

df1['col_d'] = np.where(np.isin(df1numpy1stcol.astype(np.int32),df2),
                       dfseg,df1['col_a'])

因此,df1 [输出] 为:

可乐 col_b col_c 寒冷的
0 101 104 AAB 101-104-AAB
1 337 103 加元 337-103-加元
2 524 204 DER 524-204-DER
3 129 404 EEH 129
4 842 108 人力资源 842
5 337 108 HHE 337-108-HHE

例外列表现在表示为名为“df2”的可编辑列表。

于 2021-12-14T02:13:50.510 回答