gpt4 book ai didi

python - 循环遍历每一行值并返回列名称

转载 作者:行者123 更新时间:2023-12-01 08:47:42 25 4
gpt4 key购买 nike

我有一张下表。我想使用 python 和 pandas 在表中每​​一行的 hass 列中返回行值等于 1 的列名称。

Location        House      car    Toys              haves
x 1 1 3 House, Car
y 2 1 1 Car, toys

最佳答案

首先比较 eq 的值(==) 与 dot具有列名称和最后一个的产品,按 rstrip 删除最后一个分隔符值如果性能很重要

df['haves'] = df.eq(1).dot(df.columns + ', ').str.rstrip(', ')
#solution with omiting first column
#df['haves'] = df.iloc[:, 1:].eq(1).dot(df.columns[1:] + ', ').str.rstrip(', ')
print (df)
Location House car Toys haves
0 x 1 1 3 House, car
1 y 2 1 1 car, Toys

详细信息:

print (df.eq(1))
Location House car Toys
0 False True True False
1 False False True True

print (df.eq(1).dot(df.columns + ', '))
0 House, car,
1 car, Toys,
dtype: object

性能:取决于 1 值的数量、列数和行数,但由于 dot 已矢量化,因此速度比循环解决方案更快:

#2k rows
df = pd.concat([df] * 1000, ignore_index=True)

In [183]: %timeit df['haves'] = df.eq(1).dot(df.columns + ', ').str.rstrip(', ')
2.65 ms ± 34.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

#working if no missing values
In [184]: %timeit df['haves'] = [x.rstrip(', ') for x in df.eq(1).dot(df.columns + ', ')]
2.43 ms ± 38.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

#jpp answer
In [185]: %timeit df['haves'] = [', '.join(df.columns[1:][idx]) for idx in df.iloc[:, 1:].eq(1).values]
86.5 ms ± 4.32 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

#Naga Kiran removed answer
In [186]: %timeit df['have'] = df.apply(lambda x: ','.join(x[x.eq(1)].index),1)
813 ms ± 8.66 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 循环遍历每一行值并返回列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53240700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com