Проверка того, находятся ли значения пирамидного кадра данных между двумя списками.Добавление логического столбца - PullRequest
4 голосов
/ 24 сентября 2019

Я пытаюсь добавить новый столбец в pandas Dataframe (False / True), который отражает, находится ли значение между двумя точками данных из другого файла.

У меня есть два файла, которые дают следующую информацию:

File A:(x)                        File B:(y)
   'time'                            'time_A'  'time_B'
0   1                             0     1       3
1   3                             1     5       6
2   5                             2     8       10
3   7
4   9
5   11
6   13

Я пытался сделать это с помощью функции .map, однако она дает true и false для каждого события, а не для одного столбца.

x['Event'] = x['time'].map((lamda x: x< y['time_A']),(lamda x: x> y['time_B']))

Это будетожидаемый результат ->

File A: 
   'time'  'Event'          
0   1        True      
1   3        True           
2   5        True
3   7        False
4   9        True
5   11       False
6   13       False

Однако я получаю что-то вроде этого ->

File A:
     'time'
0   1 "0   True 
1   True
2   True"
Name:1, dtype:bool"
2   3 "0   True 
1   True
2   True
Name:1, dtype:bool"

Ответы [ 3 ]

3 голосов
/ 24 сентября 2019

Это должно сделать это:

(x.assign(key=1)
  .merge(y.assign(key=1),
         on='key')
  .drop('key', 1)
  .assign(Event=lambda v: (v['time_A'] <= v['time']) &
                          (v['time'] <= v['time_B']))
  .groupby('time', as_index=False)['Event']
  .any())

   time  Event
0     1   True
1     3   True
2     5   True
3     7  False
4     9   True
5    11  False
6    13  False
2 голосов
/ 24 сентября 2019

Используйте pd.IntervalIndex здесь:

idx=pd.IntervalIndex.from_arrays(B['time_A'],B['time_B'],closed='both')
#output-> IntervalIndex([[1, 3], [5, 6], [8, 10]],closed='both',dtype='interval[int64]')
A['Event']=B.set_index(idx).reindex(A['time']).notna().all(1).to_numpy()
print(A)

   time  Event
0     1   True
1     3   True
2     5   True
3     7  False
4     9   True
5    11  False
6    13  False
2 голосов
/ 24 сентября 2019

Один вкладыш:

A['Event'] = sum(A.time.between(b.time_A, b.time_B) for _, b in B.iterrows()) > 0

Объяснение:

  • Для каждой строки b кадра данных B, A.time.between(b.time_A, b.time_B) возвращает логический ряд, если time находится между time_Aи time_B
  • sum(list_of_boolean_series) > 0: поэлементно OR
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...