首页 > 解决方案 > 如何用不同的变量在 pd.DataFrame 中形成另一个列

问题描述

我正在尝试通过在其他变量中具有多个条件的 if 语句来创建一个新的布尔变量。但到目前为止,我的许多尝试甚至都不能使用变量作为参数。

数据框中使用的列的头部

如果你们中的任何人都能看到这个问题,我将不胜感激,我已经在整个万维网上搜索了两天。但作为初学者,我还没有找到解决方案。

amount = df4['AnzZahlungIDAD']
time = df4['DLZ_SCHDATSCHL']
Erstr = df4['Schadenwert']
Zahlges = df4['zahlgesbrut']
timequantil = time.quantile(.2)
diff = (Erstr-Zahlges)/Erstr*100
diffrange = [(diff <=15) & (diff >= -15)]
special = df4[['Taxatoreneinsatz', 'Belegpruefereinsatz_rel', 'IntSVKZ', 'ExtTechSVKZ']]

第一种方法与列表理解

label = []
label = [True if (amount[i] <= 1) & (time[i] <= timequantil) & (diff == diffrange) & (special == 'N') else False for i in label]
label

使用 iterrows() 的第二种方法

df4['label'] = pd.Series([])
df4['label'] = [True if (row[amount] <= 1) & (row[time] <= timequantil) & (row[diff] == diffrange) & (row[special] == 'N') else False for row in df4.iterrows()]
df4['label']

Lambda 函数的第三种方法

df4.loc[:,'label'] = '1'
df4['label'] = df4['label'].apply([lambda c: True if (c[amount] <= 1) & (c[time] <= timequantil) & (c[diff] == diffrange) & (c[special]) == 'N' else False for c in df4['label']], axis = 0)
df4['label'].value_counts()

我希望我在我的数据框 df4 中得到一个变量“标签”,它是真还是假。

更少的尝试只给了我所有值 = False 或 all = True 即使我只使用了一个参数,这在数据上是不可能的。

第一种方法运行良好,但输出:[]

第二种方法给了我以下错误:TypeError: tuple indices must be integers or slices, not Series

第三种方法根本不加载。

标签: pythonpandasdataframeif-statementboolean

解决方案


IIUC,试试这个

time = df4['DLZ_SCHDATSCHL']
Erstr = df4['Schadenwert']
Zahlges = df4['zahlgesbrut']
# timequantil = time.quantile(.2)
diff = (Erstr-Zahlges)/Erstr*100

df4['label'] = (df4['AnzZahlungIDAD'] <= 1) & (time <= time.quantile(.2)) & (diff <=15) & (diff >= -15) & (df['Belegpruefereinsatz_rel'] =='N') & (df['Taxatoreneinsatz'] =='N') & (df['ExtTechSVKZ'] =='N') & (df['IntSVKZ'] =='N')

鉴于您的数据集,我得到以下输出

    Anz dlz sch zal taxa    bel int ext label
0   2   82  200 253.80  N   N   N   J   False
1   2   82  200 253.80  N   N   N   J   False
2   1   153 200 323.68  N   J   N   N   False
3   1   153 200 323.68  N   J   N   N   False
4   1   191 500 1252.12 N   J   N   N   False

注意:不要介意列名中使用的缩写


推荐阅读