簡體   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