根据其他列向熊猫数据框中添加一列

时间:2019-11-11 16:51:36

标签: python pandas list-comprehension

问题描述

引言:有关代码,请看下面的

假设我们有一个由3列和2行组成的pandas数据框。 我想添加一个名为“ Max_LF”的第四列,该列将包含一个数组。通过查看列“ Max_WD”来检索单元格的值。对于第一行是0.35,它将与“ WD”列中的值进行比较,其中在第三位置可以找到0.35。因此,列“ LF”的第三个值应写入列“ Max_LF”。如果在“ WD”中多次出现“ Max_WD”的值,则应将“ LF”的所有对应项写入“ Max_LF”。

尝试失败

到目前为止,我在第一次检索“ WD”中“ Max_WD”中项目的索引时有各种尝试。在潜在地获取索引之后,想法是通过索引获取“ LF”项: df4['temp_indices'] = [i for i, x in enumerate(df4['WD']) if x == df4['Max_WD']]

但是,发生了ValueError: 引发ValueError('长度必须匹配才能进行比较') ValueError:长度必须匹配才能进行比较

这是示例日期框架的样子

df = pd.DataFrame(data={'LF': [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]] , 'WD': [[0.28, 0.34, 0.35, 0.18], [0.42, 0.45, 0.45, 0.18], [0.31, 0.21, 0.41, 0.41]], 'Max_WD': [0.35, 0.45, 0.41]})

预期结果应为

df=pd.DataFrame(data={'LF': [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]] , 'WD': [[0.28, 0.34, 0.35, 0.18], [0.42, 0.45, 0.45, 0.18], [0.31, 0.21, 0.41, 0.41]], 'Max_WD': [0.35, 0.45, 0.41], 'Max_LF': [[3] ,[2,3], [3,4]]})

3 个答案:

答案 0 :(得分:3)

您只需按照以下方式使用lambda即可

df['Max_LF'] = df.apply(lambda x : [i + 1 for i, e in enumerate(x['WD']) if e == x['Max_WD']], axis=1)

输出为

    LF  Max_WD  WD  Max_LF
0   [1, 2, 3]   0.35    [0.28, 0.34, 0.35, 0.18]    [3]
1   [1, 2, 3]   0.45    [0.42, 0.45, 0.45, 0.18]    [2, 3]
2   [1, 2, 3]   0.41    [0.31, 0.21, 0.41, 0.41]    [3, 4]

答案 1 :(得分:1)

谢谢大家!在您的帮助下,我得以解决了我的问题。 像弗朗西斯亲王一样建议我先做

df['temp'] = df.apply(lambda x : [i for i, e in enumerate(x['WD']) if e == x['Max_WD']], axis=1)

获取“ LF”中“ WD”值的指标。然后,在第二步中,我可以通过执行以下操作添加实际的列“ Max_LF”

df['LF_Max'] = df.apply(lambda x: [x['LF'][e] for e in (x['temp'])],axis=1)

非常感谢大家!

答案 2 :(得分:0)

您可以通过applying a function over axis 1来实现。

为此,我建议您首先将WD列表转换为pd.Series(或numpy.ndarray),然后一次比较所有值。

假设您想要一个高于阈值的所有值的列表,则可以使用以下方法:

>>> def get_max_wd(x): 
...     wd = pd.Series(x.WD) 
...     return list(wd[wd >= x.Max_WD])
... 
>>> df.apply(get_max_wd, axis=1)
0          [0.35]
1    [0.45, 0.45]
2    [0.41, 0.41]
dtype: object

然后可以将apply的结果作为新列分配到数据框中:

df['Max_LF'] = df.apply(get_max_wd, axis=1)

如果您追求的只是最大值(请参见上面的评论),则可以在函数内使用max()方法。