【问题标题】:Create a column on the last row of the group that places the first row of group in first column and second in second column...etc using pandas在组的最后一行创建一列,将组的第一行放在第一列,第二列放在第二列...等使用 pandas
【发布时间】:2021-09-19 01:45:20
【问题描述】:

我有一个表,其中有同一个实例的多个条目以及对该实例的多次调用。我正在尝试为每个调用创建一个列,其中最后一个调用从第一个调用开始每行都有一个列。这是一个示例表:

Name Discharge Date Recorded Time
A 7/1/2021 7/2/2021 13:20
A 7/1/2021 7/3/2021 8:45
A 7/15/2021 7/15/2021 9:00
A 7/15/2021 7/15/2021 11:32
A 7/15/2021 7/15/2021 14:14
A 7/20/2021 7/21/2021 10:02
B 7/3/2021 7/4/2021 11:46
B 7/6/2021 7/7/2021 9:34
B 7/6/2021 7/7/2021 12:23
B 7/6/2021 7/8/2021 8:58
B 7/6/2021 7/8/2021 15:51
B 7/29/2021 7/30/2021 11:12
B 7/29/2021 7/30/2021 16:41

我基本上是想让它看起来像这样:

Name Discharge Date Recorded Time Call 1 Call 2 Call 3 Call 4
A 7/1/2021 7/3/2021 8:45 7/2/2021 13:20 7/3/2021 8:45
A 7/15/2021 7/15/2021 14:14 7/15/2021 9:00 7/15/2021 11:32 7/15/2021 14:14
A 7/20/2021 7/21/2021 10:02 7/21/2021 10:02
B 7/3/2021 7/4/2021 11:46 7/4/2021 11:46
B 7/6/2021 7/8/2021 15:51 7/7/2021 9:34 7/7/2021 12:23 7/8/2021 8:58 7/8/2021 15:51
B 7/29/2021 7/30/2021 16:41 7/30/2021 11:12 7/30/2021 16:41

我试过换班

df1['Call 1'] = df1.groupby(['Name', 'Discharge Date'])['RECORDED_TIME'].shift(-1)
df1['Call 2'] = df1.groupby(['Name', 'Discharge Date'])['RECORDED_TIME'].shift(-2)
df1['Call 3'] = df1.groupby(['Name', 'Discharge Date'])['RECORDED_TIME'].shift(-3)
df1['Call 4'] = df1.groupby(['Name', 'Discharge Date'])['RECORDED_TIME'].shift(-4)

这让我倒退了最后一行。我尝试过第 n 个,例如:

df1['Call 1'] = df1.groupby(['Name', 'Discharge Date'], as_index=False)['RECORDED_TIME'].nth(0)
df1['Call 2'] = df1.groupby(['Name', 'Discharge Date'], as_index=False)['RECORDED_TIME'].nth(1)
df1['Call 3'] = df1.groupby(['Name', 'Discharge Date'], as_index=False)['RECORDED_TIME'].nth(2)
df1['Call 4'] = df1.groupby(['Name', 'Discharge Date'], as_index=False)['RECORDED_TIME'].nth(3)

我已尝试更改位置编号,但它们不会循环播放。所以我似乎无法从该组呼叫中的第一个呼叫中捕捉到呼叫 1。重申一下,我正在尝试在组的最后一个呼叫上创建一个列,将第一个呼叫放在列呼叫 1 中,第二个呼叫放在列呼叫 2 中,等等。放弃其他呼叫并将最后一个呼叫保持在记录的时间内很容易一次我可以在那里获得那些新列。

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    这行得通:

    gb = df.groupby(["Name", "Discharge Date"])["Recorded Time"]
    result = pd.concat([gb.last(), 
                        pd.DataFrame(gb.apply(lambda x: pd.Series(x.values)).unstack()).add_prefix("Call ")], 
                       axis=1)
    

    【讨论】:

    • 这工作得非常好,并且没有将姓名和出院日期保留为索引没有任何问题,只需将 as_index=False 添加到 groupby 即可解决该问题。删除实际代码中的其他列的代码仍然存在相同的问题。这两个代码都写得很好,现实是我可以返回并将其加入原始代码并删除不必要的行,只是想知道是否使用相同的代码(经过一些修改)我可以保留所有原始代码列也是如此。这已经删除了不需要的行。
    • 如果您想保留其他列,您可能必须使用pd.merge
    • 我想的差不多了。这就是我所做的,它以这种方式完美运行。我只是想知道。感谢您的帮助。
    • 不幸的是,这一直是我在groupby 之后必须保留原始列的方式。不是说没有更好的方法,但我不知道是否有
    【解决方案2】:

    试试这个:

    gc = ['Name','Discharge Date']
    rc = df.groupby(gc)['Recorded Time'].last()
    
    (df.assign(cc = lambda x: x.groupby(gc).cumcount())
     .set_index(gc + ['cc'])['Recorded Time'].unstack()
     .rename(lambda x: 'Call {}'.format(x+1),axis=1).join(rc))
    

    【讨论】:

    • 这很好用。尝试不将姓名和出院日期作为索引时遇到问题。此外,虽然示例没有任何其他列,但原始列也有,并且在运行后它会删除所有其他列。尝试将 as_index=False 添加到 groupby 但收到错误消息。
    • 你可以在末尾添加reset_index()
    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2021-05-03
    • 1970-01-01
    • 2017-09-27
    相关资源
    最近更新 更多