[英]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
我怎樣才能得到這個數據幀?
我做了谷歌搜索“數據幀減法”,但它沒有顯示我想要的結果,我的搜索出了什么問題?
我們可以做到以下幾點:
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
IIUC first
在groupby
下獲得然后使用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.