簡體   English   中英

我怎樣才能減去數據幀?

[英]how can I subtract in 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

我怎樣才能得到這個數據幀?

我做了谷歌搜索“數據幀減法”,但它沒有顯示我想要的結果,我的搜索出了什么問題?

我們可以做到以下幾點:

  1. Groupby on number並獲得每組的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

IIUC firstgroupby下獲得然后使用dropna分配diff

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

如果行總是按照示例中所示進行配對和排序,那么只需執行簡單的數學運算,然后執行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()

注意:需要對行進行排序,以便同一組中的行連續排列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM