Python 基于其他列向数据帧添加列
问题描述 介绍性备注:有关代码,请查看下面的内容 假设我们有一个由3列和2行组成的熊猫数据框架。 我想添加一个名为“Max_LF”的第四列,它将由一个数组组成。通过查看列“Max_WD”来检索单元格的值。第一行为0.35,将与“WD”列中的值进行比较,其中第三个位置为0.35。因此,列“LF”的第三个值应写入列“Max_LF”。如果“Max_WD”的值在“WD”中多次出现,则“LF”的所有对应项都应写入“Max_LF” 尝试失败 到目前为止,我在“WD”中的“Max_WD”中首次检索该项的索引时进行了各种尝试。在可能检索到索引后,想法是通过索引获取'LF'项: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”中首次检索该项的索引时
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)
谢谢大家 我认为你的第一个问题是,看起来你正在尝试制作某种三维模型。你的问题令人困惑,我建议你简化它。你最初是如何创建数据帧的?在数据帧中存储列表通常是一个坏主意,在这种情况下,使这些相当简单的操作比需要的困难得多。如果你改为使用多索引,这是相当简单和更有效的。预期结果的例子并不符合你的描述。您说新列应该包含阈值以上所有值的列表,但示例仅显示标量值。