Pandas - 是否可以根据其他列中的布尔值将这些值视为变量来创建列?

Pandas - Is it possible to create a column based on boolean values in other columns treating these as variables?

我说清楚了:我想在一个假设的数据框中生成一个新列,它可能有不同数量的布尔值列。这些“布尔列”是先前根据其他参数创建的,它们可以是 3、4 或 10(例如 k1、k2、k3、k4 等)。 我知道我可以设置这样的代码:

def get_set(row):
if row['k1'] == True:
    return 'k1'
if row['k2'] == True:
    return 'k2'
if row['k3'] == True:
    return 'k3'
if row['k4'] == True:
    return 'k4'

然后创建新列:

data_frame['Set number'] = data_frame.apply(get_set, axis=1)

但是如果我需要使这个过程自动化怎么办?我的意思是,我希望写一些独立于列(集合)数量的东西,并且每次通过输入给出集合时都能工作。 我试过这个:

def get_set2(row):
discontinuity_set = []
while True:
    n = 'k' + (input('set index: '))
    if n == 'kstop':
        return discontinuity_set
        break
    else:
        discontinuity_set.append(n)
if row[discontinuity_set] == True:
    return discontinuity_set

试图生成一个列表,.apply 可以从中绘制以创建新列,但我收到此错误消息:

TypeError: 'DataFrame' object is not callable

还有一个for循环结果不好。

有谁知道如何做到这一点?我真的很感激任何形式的帮助。谢谢

这有帮助吗?

df['res'] = False
strings= ['k4','k3','k2','k1']
for key in strings:
    df[df[key ] == true]['res'] = key 

您可以使用列表理解来过滤布尔列名称,只要它们具有使它们与其他列不同的模式即可。然后在使用 DataFrame.apply 时将其传递给您的函数(额外的关键字参数传递给要应用的函数)。

def get_set(row, names):
    for name in names:
        if row[name] == True:
            return name


boolean_columns = [col for col in data_frame.columns if col.startswith('k')]
data_frame['Set number'] = data_frame.apply(get_set, axis=1, names=boolean_columns)

或者:

import numpy as np
import pandas as pd

d = pd.DataFrame(np.random.choice([True, False], (4, 5)), 
                 columns = ['k' + str(x) for x in range(5)])
d['something'] = list('ASDE')

def get_set(*args):
    for row in args:
        for i, x in enumerate(row):
            if x : 
                return i
    
d['Set number'] = [d.columns[x]\
                   for x in d\
                       .reindex(sorted(d.columns), axis = 1)\
                        .loc[:, d.columns.str.startswith('k')]\
                        .apply(get_set, axis = 1)]
print(d)

#       k0     k1     k2     k3     k4 something Set number
# 0  False  False   True  False  False         A         k2
# 1  False  False   True   True  False         S         k2
# 2   True   True  False  False  False         D         k0
# 3   True   True  False  False  False         E         k0