繁体   English   中英

基于其他列向 pandas dataframe 添加列

[英]Adding a column to a pandas dataframe based on other columns

问题描述

介绍性评论:代码请看下面

假设我们有一个由 3 列和 2 行组成的 pandas dataframe。 我想添加一个名为“Max_LF”的第四列,它将由一个数组组成。 通过查看“Max_WD”列来检索单元格的值。 对于将是 0.35 的第一行,它将与“WD”列中的值进行比较,其中 0.35 可以在第三个 position 中找到。 因此,“LF”列的第三个值应写入“Max_LF”列。 如果'Max_WD'的值在'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:raise ValueError('Lengths must match to compare') ValueError: Lengths must match to compare

这就是示例日期框架的样子

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]]})

您可以通过简单地使用lambda来获得它,如下所示

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

output 是

    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]

多谢你们。 在您的帮助下,我能够解决我的问题。 就像弗朗西斯王子建议我先做的那样

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)

非常感谢你们!

您可以通过在轴 1 上应用 function来实现它。

为此,我建议您首先将 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的结果作为新列分配到 dataframe 中:

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

如果你所追求的只是最大值(见我上面的评论),你可以使用 function 中的max()方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM