Pandas迭代地从多列中追加行值

时间:2017-02-01 17:34:36

标签: python pandas

问候!

我想迭代地将多列中的行值附加到基于组的新df中的新列。

我的目标是为每位客户提供1行,其中1列为客户ID,1列为其时间轴,按行时间顺序列出所有日期和事件的事件描述后的每个事件的日期。

我用一系列词典解决了这个问题。我正在寻找一种干净,优雅,熊猫式的方式来实现这一目标,因为这些代码将经常运行,只需对客户,活动等进行小的更改。

示例:

import pandas as pd

df_have = pd.DataFrame({'Customer_ID':['customer_1','customer_1','customer_1','customer_2','customer_2'], 
                        'Event':['purchased cornflakes','purchased eggs', 'purchased waffles','sold eggs','purchased cows'],
                           'Date':['2011-06-16','2011-06-13','2011-06-09','2011-06-13','2011-06-18']})

df_have['Date'] = pd.to_datetime(df_have['Date'])

df_have.sort_values(['Customer_ID','Date'], inplace =True)
df_have

df I currently have

df_want = pd.DataFrame({'Customer_ID':['customer_1','customer_2'],
                       'Time_Line':[['2011-06-09,purchased waffles,2011-06-13,purchased eggs,2011-06-16,purchased cornflakes'],
                                   ['2011-06-13,sold eggs,2011-06-18,purchased cows']]})
df_want

df I'd like to have

1 个答案:

答案 0 :(得分:2)

步骤:

1)将 Customer_ID 设置为索引轴,因为它在整个操作过程中保持静态。

2)stack以便 Date Event 低于彼此。

3)在索引(groupby)中执行level=0并将唯一列转换为list。由于我们按照这个顺序堆叠它们,它们会交替出现。

# set maximum width of columns to be displayed
pd.set_option('max_colwidth', 100)

df_have.set_index('Customer_ID').stack(
    ).groupby(level=0).apply(list).reset_index(name="Time_Line")

enter image description here

更改list内的序列顺序:

df_have.set_index('Customer_ID').reindex_axis(['Event', 'Date'], axis=1).stack(
    ).groupby(level=0).apply(list).reset_index(name="Time_Line")

enter image description here