как я могу вычесть в кадре данных? - PullRequest
1 голос
/ 05 апреля 2019

это мой фрейм данных

    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 ]

2 голосов
/ 05 апреля 2019

Мы можем сделать следующее:

  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 голос
/ 05 апреля 2019

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
0 голосов
/ 05 апреля 2019

Если строки всегда спарены и упорядочены, как показано в примере, просто выполните простую математическую операцию, а затем 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()

Примечание: Строки должны быть отсортированы так, чтобы строки в одной и той же группе располагались последовательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...