Python 基于其他列向数据帧添加列

Python 基于其他列向数据帧添加列,python,pandas,list-comprehension,Python,Pandas,List Comprehension,问题描述 介绍性备注:有关代码,请查看下面的内容 假设我们有一个由3列和2行组成的熊猫数据框架。 我想添加一个名为“Max_LF”的第四列,它将由一个数组组成。通过查看列“Max_WD”来检索单元格的值。第一行为0.35,将与“WD”列中的值进行比较,其中第三个位置为0.35。因此,列“LF”的第三个值应写入列“Max_LF”。如果“Max_WD”的值在“WD”中多次出现,则“LF”的所有对应项都应写入“Max_LF” 尝试失败 到目前为止,我在“WD”中的“Max_WD”中首次检索该项的索引时

问题描述

介绍性备注:有关代码,请查看下面的内容

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

尝试失败

到目前为止,我在“WD”中的“Max_WD”中首次检索该项的索引时进行了各种尝试。在可能检索到索引后,想法是通过索引获取'LF'项:
df4['temp_index']=[i表示i,x表示枚举(df4['WD']),如果x==df4['Max_WD']]

但是,出现了ValueError: raise VALUERROR('长度必须匹配才能比较') ValueError:长度必须匹配才能进行比较

这就是示例日期框的外观

df=pd.DataFrame(数据={'LF':[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],'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,4],/p>您可以通过它来实现

为此,我建议您首先将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()
方法。

只需使用
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]

谢谢大家!在你的帮助下,我解决了我的问题。 就像弗朗西斯王子建议我第一次那样

df['temp']=df.apply(λx:[i表示枚举中的i,e(x['WD']),如果e==x['Max_WD']],轴=1)

要获取'LF'中'WD'值的指示符。在第二步中,我可以通过

df['LF_Max']=df.apply(λx:[x['LF'][e]表示e in(x['temp']),轴=1)


谢谢大家

我认为你的第一个问题是,看起来你正在尝试制作某种三维模型。你的问题令人困惑,我建议你简化它。你最初是如何创建数据帧的?在数据帧中存储列表通常是一个坏主意,在这种情况下,使这些相当简单的操作比需要的困难得多。如果你改为使用多索引,这是相当简单和更有效的。预期结果的例子并不符合你的描述。您说新列应该包含阈值以上所有值的列表,但示例仅显示标量值。