bet*_*eta 6 python apply dataframe pandas
我有以下包含 2 列(简化)的 Pandas 数据框。第一列包含玩家姓名,第二列包含日期(datetime对象):
player date
A 2010-01-01
A 2010-01-09
A 2010-01-11
A 2010-01-15
B 2010-02-01
B 2010-02-10
B 2010-02-21
B 2010-02-23
Run Code Online (Sandbox Code Playgroud)
我想添加一个列差异,表示每个玩家的天数时差。结果应如下所示:
player date diff
A 2010-01-01 0
A 2010-01-09 8
A 2010-01-11 2
A 2010-01-15 4
B 2010-02-01 0
B 2010-02-10 9
B 2010-02-21 11
B 2010-02-23 2
Run Code Online (Sandbox Code Playgroud)
第一行有0差异,因为没有更早的日期。第二行显示8,因为之间的差异2010-01-01,并2010-01-09为八天。
问题不是计算两个datetime物体之间的日差。我只是不确定如何添加新列。我知道,我必须先制作groupby( df.groupby('player')) 然后使用apply(或者可能transform?)。但是,我被卡住了,因为为了计算差异,我需要参考apply-function 中的前一行,如果可能的话,我不知道该怎么做。
非常感谢。
更新:
在尝试了以下两种建议的解决方案后,我发现它们不适用于我的代码。经过一番头痛,我发现我的数据有重复的索引。所以在我发现我有重复的索引后,一个简单的方法df.reset_index()解决了我的问题,并且建议的解决方案奏效了。由于两种解决方案都有效,但我只能将其中一个标记为正确,因此我将选择更简洁/更短的解决方案。不过还是要感谢你们!
你可以简单地写:
df['difference'] = df.groupby('player')['date'].diff().fillna(0)
Run Code Online (Sandbox Code Playgroud)
这为新的 timedelta 列提供了正确的值:
player date difference
0 A 2010-01-01 0 days
1 A 2010-01-09 8 days
2 A 2010-01-11 2 days
3 A 2010-01-15 4 days
4 B 2010-02-01 0 days
5 B 2010-02-10 9 days
6 B 2010-02-21 11 days
7 B 2010-02-23 2 days
Run Code Online (Sandbox Code Playgroud)
(我使用名称“difference”而不是“diff”来区分名称和方法diff。)
如果您想手动实现它,另一种方法是执行以下操作
def date_diff(df):
df['difference'] = df['date'] - df['date'].shift()
df['difference'].fillna(0 ,inplace = True)
return df
In [30]:
df_final = df.groupby(df['player']).apply(date_diff)
df_final
Out[30]:
player date difference
A 2010-01-01 0 days
A 2010-01-09 8 days
A 2010-01-11 2 days
A 2010-01-15 4 days
B 2010-02-01 0 days
B 2010-02-10 9 days
B 2010-02-21 11 days
B 2010-02-23 2 days
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10303 次 |
| 最近记录: |