Python 熊猫:计算一行和所有其他行之间的差异
我正在尝试创建与日期列中的每个日期对应的新列。每列必须包含日期与所有其他日期之间的差异 输入:Python 熊猫:计算一行和所有其他行之间的差异,python,python-3.x,pandas,Python,Python 3.x,Pandas,我正在尝试创建与日期列中的每个日期对应的新列。每列必须包含日期与所有其他日期之间的差异 输入: date 11-Sep-18 8-Jun-18 12-Sep-17 12-Jun-17 输出必须是: date Diff_date1 Diff_date2 Diff_date3 Diff_date4 11-Sep-18 0 -95 -364 -456 8-Jun-18 95 0
date
11-Sep-18
8-Jun-18
12-Sep-17
12-Jun-17
输出必须是:
date Diff_date1 Diff_date2 Diff_date3 Diff_date4
11-Sep-18 0 -95 -364 -456
8-Jun-18 95 0 -269 -361
12-Sep-17 364 269 0 -92
12-Jun-17 456 361 92 0
编辑:子问题
我怎样才能用groupby做到这一点?每个组中有不同数量的行
ID date Diff_date1 Diff_date2 Diff_date3 Diff_date4
A 11-Sep-18 0 -95 -364 -456
A 8-Jun-18 95 0 -269 -361
A 12-Sep-17 364 269 0 -92
A 12-Jun-17 456 361 92 0
ID date Diff_date1 Diff_date2 Diff_date3 Diff_date4 Diff_date5
B 11-Jun-18 0 -123 -395 -456 -730
B 8-Feb-18 123 0 -272 -333 -607
B 12-May-17 395 272 0 -61 -335
B 12-Mar-17 456 333 274 0 -274
B 11-Jun-16 730 607 398 274 0
设置
您可以使用
subtract.outer
d = np.subtract.outer(df.date, df.date)
u = pd.DataFrame(d, index=df.date).rename(columns=lambda x: f'Diff_date{x+1}')
如果您想要相反的关系(可能基于所需的输出),只需使用
numpy广播
s=pd.to_datetime(df.date)
df=pd.concat([df,pd.DataFrame((s.values[:,None]-s.values)/np.timedelta64(1, 'D'),index=df.index)],axis=1)
df
Out[193]:
date 0 1 2 3
0 11-Sep-18 0.0 95.0 364.0 456.0
1 8-Jun-18 -95.0 0.0 269.0 361.0
2 12-Sep-17 -364.0 -269.0 0.0 92.0
3 12-Jun-17 -456.0 -361.0 -92.0 0.0
另一种使用numpy的方式
df['date'] = pd.to_datetime(df['date'])
columns = ['Diff_date_' + str(i) for i in np.arange(len(df['date']))]
pd.DataFrame(df['date'].values - df['date'].values[:,np.newaxis], index = df['date'], columns = columns)
Diff_date_0 Diff_date_1 Diff_date_2 Diff_date_3
date
2018-09-11 0 days -95 days -364 days -456 days
2018-06-08 95 days 0 days -269 days -361 days
2017-09-12 364 days 269 days 0 days -92 days
2017-06-12 456 days 361 days 92 days 0 days
只是增加了一个小问题。你能看一看吗?只是增加了一个子问题。你能看一看吗?@user0205到时候和小组一起做,因为刚才添加了一个子问题。你能看一下吗?
s=pd.to_datetime(df.date)
df=pd.concat([df,pd.DataFrame((s.values[:,None]-s.values)/np.timedelta64(1, 'D'),index=df.index)],axis=1)
df
Out[193]:
date 0 1 2 3
0 11-Sep-18 0.0 95.0 364.0 456.0
1 8-Jun-18 -95.0 0.0 269.0 361.0
2 12-Sep-17 -364.0 -269.0 0.0 92.0
3 12-Jun-17 -456.0 -361.0 -92.0 0.0
df['date'] = pd.to_datetime(df['date'])
columns = ['Diff_date_' + str(i) for i in np.arange(len(df['date']))]
pd.DataFrame(df['date'].values - df['date'].values[:,np.newaxis], index = df['date'], columns = columns)
Diff_date_0 Diff_date_1 Diff_date_2 Diff_date_3
date
2018-09-11 0 days -95 days -364 days -456 days
2018-06-08 95 days 0 days -269 days -361 days
2017-09-12 364 days 269 days 0 days -92 days
2017-06-12 456 days 361 days 92 days 0 days