如何返回与熊猫数据框中的每一行都符合条件的列标题?

调味酱

我有一个形式的熊猫数据框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是布尔值。

我正在尝试生成一个新的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

另一个切片数据和一些布尔索引-

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)

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何扩展 pandas 数据框,使每一行都成为之前的所有行?

如何删除熊猫数据框中的每一行?

如何从熊猫数据框中的列中的每一行中删除重复值

遍历pyspark数据框的行,但将每一行都保留为一个数据框

如何在数据框中创建新列,其中新列的每一行都是所有先前行的乘法

如何“加入/关联”2 个数据帧,以便左侧数据帧的每一行都“附加”到右侧数据帧的每一行

熊猫数据框中每一行的随机值

如何为熊猫数据框的每一行打印索引值,列名和列数据?

为熊猫数据框的每一行替换一列中的字符串

在大熊猫数据框中对代码进行矢量化处理,其中每一行都应视为一个numpy数组

如何检查熊猫数据框中的datetime列是否属于每一行相同的日期?

组中每一行的熊猫条件列值

为熊猫数据框中的每一行选择切片/列范围

如何转换在每一列的每一行中包含列表的数据框

如何获取数据框中每一行的每一列的值和类型?

如何让.stdout_lines / array中的每一行都匹配一个变量

數據框中的逐行操作,其中每一行都取決於 R 中的前一行

如何将熊猫数据框中的每一行乘以不同的值

如何对熊猫数据框中的每一行进行排序并获取索引?

如何有效地从熊猫数据框中减去每一行?

如何迭代熊猫数据框中每一行的下 N 个元素的窗口

对每一行数据框的列求和,并在多级索引熊猫数据框中添加新列

是否对每一行都进行更改?

每一行都无法回声不同

在熊猫列中查找唯一值,其中每一行都有多个值

如何在Scala / Spark数据框中的每一行使用withColumn带条件

如果Linter在每一行都抛出错误,该如何工作?

我可以使用groupby在Pandas数据框中创建每一行都是运行列表的列吗?

如果txt中的每一行都存在字符iif后删除文本