For循环使用条件和计数器在数据框中分配值

时间:2019-07-16 21:20:38

标签: python pandas dataframe for-loop

我是Python新手,使用if语句进行for循环时遇到问题。

我的数据帧包含NameAgeMember(是/否)和BMonth(出生月):

Name Age Member BMonth
Billy   2 Y Jan
Anne    4 Y Jan
Frank   5 Y Jan
Greg    6 Y Jan
Jane    7 Y Jan
Charlie 3 Y Feb
Mike    3 N Jan
Joe     8 N Jan
...

我正尝试添加一个符合以下条件的新列CMonth(“庆祝月”):

  • 一个CMonth最多可容纳4个孩子
  • 优先考虑成员和年幼的孩子(例如:Jan将拥有Billy,Anne,Frank和Greg)
  • 如果一个CMonth的孩子超过4个,请将其余的孩子转移到下一个CMonth(例如:Mike&Joe将在2月)
  • 如果以下CMonth有4个以上的孩子(包括前一个月的孩子),则按会员和年幼的孩子(按年龄)划分优先级

预期结果:

Name Age Member BMonth CMonth
Billy   2 Y Jan Jan
Anne    4 Y Jan Jan
Frank   5 Y Jan Jan
Greg    6 Y Jan Jan
Charlie 3 Y Feb Feb
Jane    7 Y Jan Feb
Mike    3 N Jan Feb
Joe     8 N Jan Feb
...

我尝试过:

count = {}

for month in range(1,13):

    for i in df['Name']:
        if count[month] < 5:
            df['CMonth'] = df['BMonth']
            count[month] = count[month] + 1
        else if count[month+1] < 5:
            df['CMonth'] = df['BMonth']
            count[month+1] = count[month+1] + 1

1 个答案:

答案 0 :(得分:0)

最好在多列上使用pandas groupby()。我将给您提示,而不仅仅是显示代码。您也应该尝试编写代码,这将帮助您澄清问题中的歧义:

  • “一个月最多可容纳4个孩子”
  • “优先考虑成员和年幼的孩子(例如:Jan将拥有Billy,Anne,Frank和Greg)”
    • 那么,您需要groupby()的哪些列,然后执行自定义的sort_values()
  • “如果一个月有四个以上的孩子[出生月?庆祝月?还是??请澄清],将其余的孩子转移到下个月(例如:迈克和乔在二月)”
    • 嗯,这是不寻常的,而且非常模棱两可,您需要澄清这个问题。假设2月有非会员,应该从1月起改写会员资格,还是撞到3月?请尝试编写代码,查看中间结果,然后编辑问题进行澄清。您还需要编辑一个更好的数据示例以强调这种情况。
    • 您总是可以在ungroup()之后然后在groupby(['CMonth','Member'])之后再最后是.head(4)
    • 的末尾进一步操纵组。