【问题标题】:nested if in list/ dataframe with python使用python嵌套在列表/数据框中
【发布时间】:2017-12-19 03:44:04
【问题描述】:
我有一个数据框,其中有 df['kVA'] 和 df['Phase'] 列。我正在尝试创建一个列 df['Line'],但具有以下条件:
-
逐阶段定义
df['Line']=['1PH' if x=='1PH' else '3PH' for x in df['Phase'] ]
-
逐相定义线和千伏安 - 所需的输出
df['Line']=['1PH' if x=='1PH' else ['3PHSM' if y<=750 else '3PHLG' for y in df['kVA']] for x in df['Phase'] ]
按阶段定义的代码有效。但是,如果我尝试集成嵌套代码,则代码会停止。我正在尝试按相位和 kVA 特性将产品分类到生产线。 kVA 和 Phase 都是我的数据框中的列(如附件)。
我该如何解决这个问题?
【问题讨论】:
标签:
python
list
pandas
dataframe
【解决方案1】:
Pandas 是一个很棒的工具。我会这样做:
# create some similar data
import pandas as pd
df = pd.DataFrame({'Phase': ['1PH', '3PH', '3PH', '1PH'], 'kVA': [50, 750, 300, 37.5]})
# add a new column (some elements will not change)
df['Line'] = df['Phase']
# modify rows that fit your criteria
df.loc[ (df.kVA < 750) & (df.Phase == '3PH'), 'Line'] += 'SM'
df.loc[ (df.kVA >= 750) & (df.Phase == '3PH'), 'Line'] += 'LG'
.loc 和 iloc 非常适合过滤部分数据框。
注意:我正在使用 Pandas v0.20.3 进行此测试。
【解决方案2】:
要以更像大熊猫的方式做到这一点,您可能想要做更多这样的事情:
one_phase = df['Phase'] == '1PH'
small = df['kVA'] <= 750
df['Line'][one_phase] = '1PH'
df['Line'][~one_phase & small] = '3PHSM'
df['Line'][~one_phase & ~small] = '3PHLG'
注意:您没有留下任何可解析的样本数据,因此未对此进行测试。