根据其他列的行值填充新的pandas数据框列

时间:2019-07-03 21:48:56

标签: python pandas dataframe

我想根据条件在数据框中添加其他列的名称作为值的新列。

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>

我在搜索中找不到与之接近的任何内容都没有成功,可能是由于努力在搜索栏中形成一个好问题。我没有发现有人试图根据条件将其他列名作为值拉出的任何问题。

感谢您的帮助!

1 个答案:

答案 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]