我有一個資料框,其中一列是一列陣列。對于下面的特定示例,我有一個名為price_array的列,其中每行(供應商唯一)都有一個價格陣列,長度為 3,表示 3 個專案。我創建應該上的專案數量可變的作業中的作用這就是為什么我喜歡在一個陣列,而不是某列的價格price0,價格1,price2。
df = pd.DataFrame({'supplier':['Abc Co','XYZ Inc','Bob and Sam'],
'price_array':[[2.00,3.50,1.00],[7.00,5.00,1.05],[2.00,10.50,3.40]],
'price_sum':[6.50,13.05,15.90],
'price0':[2.00,7.00,2.00]})
我希望能夠在price_array 的條件下過濾資料框。為了說明,我為陣列和陣列的第一個元素的總和制作了額外的列。使用這些列,我可以過濾如下:
display(df[df.price_sum>10])
display(df[df.price0==2.00])
我想做的是類似于下面的事情,但我無法使語法起作用(不可否認,我是 python 新手):
display(df[np.sum(df.price_array)>10.00])
display(df[df.price_array[0]==2.00])
這樣的事情可能嗎?什么是正確的語法?另一種選擇是不具備陣列列,而是創建一個變數數目與變數名(列price0,價格1,price2等),但看起來它可能是麻煩的參考,我希望能夠到根據專案編號的存盤變數參考這些列。
uj5u.com熱心網友回復:
以下代碼是您完成此操作的方式:
import pandas as pd
import numpy as np
df = pd.DataFrame({'supplier':['Abc Co','XYZ Inc','Bob and Sam'],
'price_array':[[2.00,3.50,1.00],[7.00,5.00,1.05],[2.00,10.50,3.40]],
'price_sum':[6.50,13.05,15.90],
'price0':[2.00,7.00,2.00]})
df['price_sum'] = df['price_array'].apply(lambda x: sum(x))
df['price0'] = df['price_array'].apply(lambda x: x[0])
print(df)
# supplier price_array price_sum price0
# 0 Abc Co [2.0, 3.5, 1.0] 6.50 2.0
# 1 XYZ Inc [7.0, 5.0, 1.05] 13.05 7.0
# 2 Bob and Sam [2.0, 10.5, 3.4] 15.90 2.0
uj5u.com熱心網友回復:
這是我的兩個解決方案。
df = df.sort_values(by='price_array', key=lambda x: x[1])
bool_mask = [x[0] == 2 for x in df['price_array']]
df = df[bool_mask]
第一個使用 lambda 回傳按陣列中的值排序的資料幀。
第二個通過檢查每一行的條件來創建一個布爾掩碼。在 [True, False, True] 之后看起來像這樣。在資料幀上使用它會創建一個框架,其中只有 True 行在框架中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/400758.html
上一篇:重命名列與替換列屬性之間的區別
