这是我的数据框
date number name di t
0 2008-01-01 150 서울역(150) 승차 379
1 2008-01-01 150 서울역(150) 하차 145
2 2008-01-01 151 시청(151) 승차 131
3 2008-01-01 151 시청(151) 하차 35
4 2008-01-01 152 종각(152) 승차 1287
5 2008-01-01 152 종각(152) 하차 74
6 2008-01-01 153 종로3가(153) 승차 484
7 2008-01-01 153 종로3가(153) 하차 28
8 2008-01-01 154 종로5가(154) 승차 89
9 2008-01-01 154 종로5가(154) 하차 14
10 2008-01-01 155 동대문(155) 승차 190
11 2008-01-01 155 동대문(155) 하차 23
12 2008-01-01 156 신설동(156) 승차 65
13 2008-01-01 156 신설동(156) 하차 15
14 2008-01-01 157 제기동(157) 승차 156
15 2008-01-01 157 제기동(157) 하차 16
和
我想要类似减法di(승차-하차)的结果
date number name di t
0 2008-01-01 150 서울역(150) 승차 234
2 2008-01-01 151 시청(151) 승차 96
4 2008-01-01 152 종각(152) 승차 1213
6 2008-01-01 153 종로3가(153) 승차 456
8 2008-01-01 154 종로5가(154) 승차 75
10 2008-01-01 155 동대문(155) 승차 167
12 2008-01-01 156 신설동(156) 승차 50
14 2008-01-01 157 제기동(157) 승차 140
我如何获得此数据框?
我在Google上搜索了“数据框减法”,但未显示我想要的结果,我的搜索出了什么问题?
答案 0 :(得分:2)
我们可以执行以下操作:
diff
group = abs(df.groupby('number')['t'].diff().dropna())
group.index = group.index-1
df_merge = df.merge(group,
left_index=True,
right_index=True,
suffixes=['_1', ''])
df_merge.drop('t_1', axis=1, inplace=True)
print(df_merge)
date number name di t
0 2008-01-01 150 서울역(150) 승차 234.0
2 2008-01-01 151 시청(151) 승차 96.0
4 2008-01-01 152 종각(152) 승차 1213.0
6 2008-01-01 153 종로3가(153) 승차 456.0
8 2008-01-01 154 종로5가(154) 승차 75.0
10 2008-01-01 155 동대문(155) 승차 167.0
12 2008-01-01 156 신설동(156) 승차 50.0
14 2008-01-01 157 제기동(157) 승차 140.0
答案 1 :(得分:1)
IIUC在first
下获得groupby
,然后为diff
分配dropna
g=df.groupby(['date','number','name'])
yourdf=g.di.first().reset_index()
yourdf['t']=-g.t.diff().dropna().values
yourdf
Out[648]:
date number name di t
0 2008-01-01 150 서울역(150) 승차 234.0
1 2008-01-01 151 시청(151) 승차 96.0
2 2008-01-01 152 종각(152) 승차 1213.0
3 2008-01-01 153 종로3가(153) 승차 456.0
4 2008-01-01 154 종로5가(154) 승차 75.0
5 2008-01-01 155 동대문(155) 승차 167.0
6 2008-01-01 156 신설동(156) 승차 50.0
7 2008-01-01 157 제기동(157) 승차 140.0
插入一行
df.groupby(['date','number','name']).\
agg({'di':'first','t':lambda x : x.iloc[0]-x.iloc[1]}).reset_index()
Out[665]:
date number name di t
0 2008-01-01 150 서울역(150) 승차 234
1 2008-01-01 151 시청(151) 승차 96
2 2008-01-01 152 종각(152) 승차 1213
3 2008-01-01 153 종로3가(153) 승차 456
4 2008-01-01 154 종로5가(154) 승차 75
5 2008-01-01 155 동대문(155) 승차 167
6 2008-01-01 156 신설동(156) 승차 50
7 2008-01-01 157 제기동(157) 승차 140
答案 2 :(得分:0)
如果行始终如示例中所示成对和排序,则只需执行简单的数学运算,然后执行drop_duplicated()
。具有奇数索引的行的计算对结果没有影响(它们都将被丢弃)。
df2 = df.copy()
df2['t'] = df2.t - df2.t.shift(-1)
df2.drop_duplicates(['date','number','name'])
df2
# date number name di t
#0 2008-01-01 150 서울역(150) 승차 234.0
#2 2008-01-01 151 시청(151) 승차 96.0
#4 2008-01-01 152 종각(152) 승차 1213.0
#6 2008-01-01 153 종로3가(153) 승차 456.0
#8 2008-01-01 154 종로5가(154) 승차 75.0
#10 2008-01-01 155 동대문(155) 승차 167.0
#12 2008-01-01 156 신설동(156) 승차 50.0
#14 2008-01-01 157 제기동(157) 승차 140.0
更新:仅是对这个旧问题的跟踪。我上面建议的那个问题对于那些只有一行(即没有成对的行)的组来说是一个问题,但是可以通过使用另一drop_duplicated()
来解决:
# define columns to group rows
uniq_cols = ['date', 'number', 'name']
# find all groups/rows which do NOT have any paired rows
# and save them in a separate dataframe
# Here you can setup their value to NULL if needed
u = df.drop_duplicates(uniq_cols, keep=False)
# calculate the difference
df['t'] = df.t - df.t.shift(-1)
# concat the two data-frames and then drop_duplicated
# make sure `u` is before `df`, so that its values will be kept
# while the ones in `df` will be discarded
# sort_index() to get back to its original order.
pd.concat([u, df]).drop_duplicates(uniq_cols).sort_index()
注意:需要对行进行排序,以使同一组中的行连续排列。