首页 > 解决方案 > 使用 if 语句循环的有效方法

问题描述

我有一个示例数据,如下所示(真实数据集有更多列):

data = {'stringID':['AB CD Efdadasfd','RFDS EDSfdsadf dsa','FDSADFDSADFFDSA'],'IDct':[1,3,4]}
data = pd.DataFrame(data)
data['Index1'] = [[3,6],[7,9],[5,6]]
data['Index2'] = [[4,8],[10,13],[8,9]]

在此处输入图像描述

我想要实现的是我想根据 Index1 和 Index2 中的第二个元素(两者都是列表)对 stringID 列进行切片,只有当 IDct 值大于 1 时,否则返回 NaN。

我试过这个,它作为 Output1 列工作,但必须有更好的方法(我的意思是在应用于大型数据集时更快)来做到这一点,请指教,谢谢!

data['pos'] = data.Index1.map(lambda x: x[1])
data['pos1'] = data.Index2.map(lambda x: x[1])

def cal(m):
    if m['IDct'] > 1:
        return m['stringID'][m['pos']:m['pos1']]
    else:
        return 'NaN'

data['Output1'] = data.apply(cal,axis=1)

在此处输入图像描述

标签: pythonloopsif-statement

解决方案


我喜欢 pandas - 但实际上它只是属于你的工具带的众多工具之一。

pandas 和 numpy 非常适合计算和分析。可以使用 pandas 来可视化和分析您的数据 - 但这并不意味着它是适合这项工作的工具。

这种问题更适合普通的python。假设我们可以,让我们将 StringID 和 IDct 从 dict 中移出并返回到列表中。如果我们假设结果的形状是规则的(所有列表的长度相同)

StringID = ['AB CD Efdadasfd','RFDS EDSfdsadf dsa','FDSADFDSADFFDSA'],
IDct = [1,3,4]
Index1 = [[3,6],[7,9],[5,6]]
Index2 = [[4,8],[10,13],[8,9]]

for stringID, IDct, Index1, Index2 in zip(stringID, IDct, Index1, Index2):
    result = []
    if IDct > 1:
       result.append(your_indexing_goes_here())
    else:
       result.append(None) 

然后,您可以根据需要将结果数据重新混合。

data = {
    'StringID': StringID,
    'IDct': IDct,
    'Index1': Index1,
    'Index2': Index2,
    'Result': result
}

pd.DataFrame(data)

推荐阅读