如何在数据框中减去?

时间:2019-04-05 00:30:40

标签: python pandas dataframe

这是我的数据框

    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上搜索了“数据框减法”,但未显示我想要的结果,我的搜索出了什么问题?

3 个答案:

答案 0 :(得分:2)

我们可以执行以下操作:

  1. 按编号分组,并获取每个组的diff
  2. 基于索引合并回到我们的原始数据框
  3. 删除不需要的列
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()

注意:需要对行进行排序,以使同一组中的行连续排列。