带有for循环的Python定义函数

时间:2018-02-22 02:19:22

标签: python function pandas apply

我有以下DataFrame(这是一个浓缩版本 - 可以追溯到很久)

Week Commencing     A1    A2    A3      A4
2016-01-03          28    1375  1999    1345
2016-01-10          48    1552  2428    1337
2016-01-17          43    1895  2615    1420
2016-01-24          29    1950  2568    1385
2016-01-31          41    1912  2577    1277
2016-02-07          29    2176  2771    1403
2016-02-14          50    2229  3013    1450
2016-02-21          60    2271  3029    1489
2016-02-28          43    2140  3133    1594
2016-03-06          51    2080  3140    1498

我想创建一个新列,根据特定的时间段指定标签。 IE:如果行在某个日期之前,则返回一个单词。

我尝试了以下内容:

def action(x):
    if x == "True":
        return "Before Migration"
    if x == "False":
        return "After Migration"

df.index.apply(action, axis=1)

我收到以下错误:" AttributeError:' DatetimeIndex'对象没有属性' apply'"。

我已将此更改为字符串,尝试重置索引以便我可以应用于列而不是索引,但它不起作用。

我也试过这个:

if df.index < '2016-02-14':
    df["Migration_Type"] = "Before Migration"
else:
    df["Migration_Type"] = "After Migration"

错误:ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

对于更好方法的任何建议也表示赞赏。

2 个答案:

答案 0 :(得分:2)

尝试这样的事情:

# First, initialize a new column, set it to before migration by default
df = df.assign(Migration_Type = "Before Migration")
# Then, assign "after migration" to all rows after your chosen date
df.loc[df.index >= '2016-02-14', 'Migration_Type'] = "After Migration"

答案 1 :(得分:2)

df.assign(
    Migration_Type=np.where(
        df.index < '2016-02-14',
       'Before Migration',
       'After Migration'
    )
)


                 A1    A2    A3    A4    Migration_Type
Week Commencing                                        
2016-01-03       28  1375  1999  1345  Before Migration
2016-01-10       48  1552  2428  1337  Before Migration
2016-01-17       43  1895  2615  1420  Before Migration
2016-01-24       29  1950  2568  1385  Before Migration
2016-01-31       41  1912  2577  1277  Before Migration
2016-02-07       29  2176  2771  1403  Before Migration
2016-02-14       50  2229  3013  1450   After Migration
2016-02-21       60  2271  3029  1489   After Migration
2016-02-28       43  2140  3133  1594   After Migration
2016-03-06       51  2080  3140  1498   After Migration