我想根据条件在数据框中添加其他列的名称作为值的新列。
import pandas as pd
data = pd.DataFrame({
'customer': ['bob', 'jerry', 'alice', 'susan'],
'internet_bill': ['paid', 'past_due', 'due_soon', 'past_due'],
'electric_bill': ['past_due', 'due_soon', 'past_due', 'paid'],
'water_bill': ['paid', 'past_due', 'paid', 'paid']})
这是数据框。
customer internet_bill electric_bill water_bill
0 bob paid past_due paid
1 jerry past_due due_soon past_due
2 alice due_soon past_due paid
3 susan past_due paid paid
我想添加一个新列,总结什么是“ past_due”。 这是理想的结果:
customer internet_bill electric_bill water_bill past_due
0 bob past_due past_due past_due internet_bill, electric_bill, water_bill
1 jerry past_due due_soon past_due internet_bill, water_bill
2 alice due_soon past_due paid electric_bill
3 susan past_due paid paid internet_bill
我可以使用以下公式在Excel中执行此操作:
=TEXTJOIN(","&CHAR(10),TRUE,
IF(B2=Values!$A$1,$K$1,""),
IF(C2=Values!$A$1,$L$1,""),
IF(D2=Values!$A$1,$M$1,""))
最终,我的输出将是一个Excel文件,供一些护士和医院工作人员跟进患者(而不是收集账单!患者护理的东西)。我曾考虑过使用excel writer库来创建.xlsx并插入公式。
并且-我能够做到这一点,但我的直觉告诉我有一种更好的方法。这是我过去经常做的事情:
both['past_due'] = [
'internet_bill' if x == 'PAST_DUE'
else 'None' for x in df['internet_bill']]
这基本上将检查每个目标列中的行,如果该行包含'PAST_DUE',如果是,它将返回列名,移至下一个列,检查到期时间,添加列名。 / p>
我在搜索中找不到与之接近的任何内容都没有成功,可能是由于努力在搜索栏中形成一个好问题。我没有发现有人试图根据条件将其他列名作为值拉出的任何问题。
感谢您的帮助!
答案 0 :(得分:2)
>>>data['past_due'] = data.apply(lambda x: tuple(x[x == 'past_due'].index),
axis=1)
>>>data
Out[75]:
customer ... past_due
0 bob ... (electric_bill,)
1 jerry ... (internet_bill, water_bill)
2 alice ... (electric_bill,)
3 susan ... (internet_bill,)
[4 rows x 5 columns]