gpt4 book ai didi

python - 如何返回与 Pandas 数据框中每一行的条件相匹配的列标题?

转载 作者:行者123 更新时间:2023-12-05 09:09:46 28 4
gpt4 key购买 nike

我有一个 Pandas 数据框 df 的形式:

     Col1      Col2      Col3      Col4

0 True False True False
1 False False False False
2 False True False False
3 True True True True

这里的 True 和 False 是 bool 值。

我正在尝试生成一个新的 pandas 数据框 new_df,它应该如下所示:

     Matched_Cols

0 [Col1, Col3]
1 []
2 [Col2]
3 [Col1, Col2, Col3, Col4]

实现此目标的最有效方法是什么?

最佳答案

方法 #1

这里是数组数据处理-

def iter_accum(df):
c = df.columns.values.astype(str)
return pd.DataFrame({'Matched_Cols':[c[i] for i in df.values]})

示例输出-

In [41]: df
Out[41]:
Col1 Col2 Col3 Col4
0 True False True False
1 False False False False
2 False True False False
3 True True True True

In [42]: iter_accum(df)
Out[42]:
Matched_Cols
0 [Col1, Col3]
1 []
2 [Col2]
3 [Col1, Col2, Col3, Col4]

方法 #2

另一个对数组数据进行切片和一些 bool 索引 -

def slice_accum(df):
c = df.columns.values.astype(str)
a = df.values
vals = np.broadcast_to(c,a.shape)[a]
I = np.r_[0,a.sum(1).cumsum()]
ac = []
for (i,j) in zip(I[:-1],I[1:]):
ac.append(vals[i:j])
return pd.DataFrame({'Matched_Cols':ac})

基准测试

其他建议的解决方案-

# @jezrael's soln-1
def jez1(df):
return df.apply(lambda x: x.index[x].tolist(), axis=1)

# @jezrael's soln-2
def jez2(df):
return df.dot(df.columns + ',').str.rstrip(',').str.split(',')

# @Shubham Sharma's soln
def Shubham1(df):
return df.agg(lambda s: s.index[s].values, axis=1)

# @sammywemmy's soln
def sammywemmy1(df):
return pd.DataFrame({'Matched_Cols':[np.compress(x,y) for x,y in zip(df.to_numpy(),np.tile(df.columns,(len(df),1)))]})

使用 benchit包(几个基准测试工具打包在一起;免责声明:我是它的作者)来基准测试建议的解决方案。

import benchit
funcs = [iter_accum,slice_accum,jez1,jez2,Shubham1,sammywemmy1]
in_ = {n:pd.DataFrame(np.random.rand(n,n)>0.5, columns=['Col'+str(i) for i in range(1,n+1)]) for n in [4,20,100,200,500,1000]}
t = benchit.timings(funcs, in_, input_name='Len')
t.rank()
t.plot(logx=True)

enter image description here

关于python - 如何返回与 Pandas 数据框中每一行的条件相匹配的列标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62127534/

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