Python 当多个选项为真时,如何创建此列以返回列表?

Python 当多个选项为真时,如何创建此列以返回列表?,python,pandas,dataframe,Python,Pandas,Dataframe,在这个例子中,我想为每一排购买最高速度的汽车,因为它有刹车(如果两者都没有刹车,它们同样有吸引力) 请想象现实中汽车和变量的数量非常大(因此为51,52),因此“-”是可以用来循环它们的有意义的区别,而不是索引(我有意使其更简单)。试试: speeds=df.filter(regex=r“speed$”) mask=df.filter(regex=r“brakes$”) x=速度.mul(掩码值) x[“max”]=x.max(轴=1) df[“cartobuy”]=x.apply( λx:[

在这个例子中,我想为每一排购买最高速度的汽车,因为它有刹车(如果两者都没有刹车,它们同样有吸引力)

请想象现实中汽车和变量的数量非常大(因此为51,52),因此“-”是可以用来循环它们的有意义的区别,而不是索引(我有意使其更简单)。

试试:

speeds=df.filter(regex=r“speed$”)
mask=df.filter(regex=r“brakes$”)
x=速度.mul(掩码值)
x[“max”]=x.max(轴=1)
df[“cartobuy”]=x.apply(
λx:[
i、 如果val==x[“max”]
],
轴=1,
)
打印(df)
印刷品:

Car51高速车52高速车51制动器Car52制动器纸箱购买
0 1 20正确-正确[Car52]
1 200 21正确-正确[Car51]
2 19错误-错误[Car52,Car51]
3 180 18假-真[Car52]
另一个选项:

#屏蔽制动逻辑
brake_m=df.filter(regex='speed$).values*df.filter(regex='brakes$).values
#获取独特的汽车列表
cars=np.unique(np.array(df.columns.str.split('-').tolist())[:,0])
#Max上的掩码速度逻辑
速度=pd.数据帧((制动器=np.amax(制动器,轴=1)[:无]),
列=车辆)
#汇总到列表
df['cartobuy']=速度加总(λs:list(s.index[s]),轴=1)
df

   Car51-speed  Car52-speed  Car51-brakes  Car52-brakes        cartobuy
0            1           20          True          True         [Car52]
1          200           21          True          True         [Car51]
2           19           19         False         False  [Car51, Car52]
3           18           18         False          True         [Car52]

解释:

使用制动值屏蔽超速:

brake\u m

[[  1  20]
 [200  21]
 [  0   0]
 [  0  18]]
然后根据最大值屏蔽超速值(如果有多个最大值,则保持)

汽车

['Car51' 'Car52']
speed\u m

   Car51  Car52
0  False   True
1   True  False
2   True   True
3  False   True
然后将行聚集到列表中并分配回数据帧:

speed_m.agg(lambda s: list(s.index[s]), axis=1)

完整的工作示例:

import numpy as np
import pandas as pd

ExampleOfWhatIHave = {'Car51-speed': [1, 200, 19, 18],
                      'Car52-speed': [20, 21, 19, 18],
                      'Car51-brakes': [True, True, False, False],
                      'Car52-brakes': [True, True, False, True]}
df = pd.DataFrame(ExampleOfWhatIHave)

brake_m = df.filter(regex='speed$').values * df.filter(regex='brakes$').values
cars = np.unique(np.array(df.columns.str.split('-').tolist())[:, 0])
speed_m = pd.DataFrame((brake_m == np.amax(brake_m, axis=1)[:, None]),
                       columns=cars)
df['cartobuy'] = speed_m.agg(lambda s: list(s.index[s]), axis=1)

print(df)

谢谢但这给了我一个错误。。。UFUNCTYPE错误:ufunc“multiply”不包含具有签名匹配类型(dtype)的循环('能够将列表与布尔数据帧相乘是pandas的最新功能之一。更新了我的答案,使其更向后兼容。
0           [Car52]
1           [Car51]
2    [Car51, Car52]
3           [Car52]
dtype: object
import numpy as np
import pandas as pd

ExampleOfWhatIHave = {'Car51-speed': [1, 200, 19, 18],
                      'Car52-speed': [20, 21, 19, 18],
                      'Car51-brakes': [True, True, False, False],
                      'Car52-brakes': [True, True, False, True]}
df = pd.DataFrame(ExampleOfWhatIHave)

brake_m = df.filter(regex='speed$').values * df.filter(regex='brakes$').values
cars = np.unique(np.array(df.columns.str.split('-').tolist())[:, 0])
speed_m = pd.DataFrame((brake_m == np.amax(brake_m, axis=1)[:, None]),
                       columns=cars)
df['cartobuy'] = speed_m.agg(lambda s: list(s.index[s]), axis=1)

print(df)