Извлечь данные c из кадра данных - PullRequest
1 голос
/ 18 февраля 2020

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

| Start| End | Distance|
|------|-----|---------|
| A    | B   |       10|
| A    | C   |       11|
| A    | D   |       12|
| B    | C   |       13|
| B    | D   |       14|
| C    | D   |       15|

Мне нужно извлечь значения расстояния на основе списка, который показан ниже:

start_end_list = [A, B, B, C, C]

Следовательно, Извлеченное значение расстояния будет преобразовано в другой фрейм данных, представляющий собой комбинацию данных начала и окончания, как показано ниже:

| Start| End | Distance|
|------|-----|---------|
| A    | B   |       10|
| A    | B   |       10|
| A    | C   |       11|
| A    | C   |       11|
| B    | C   |       13|
| B    | C   |       13|

Как это сделать с помощью Panda Python?

1 Ответ

4 голосов
/ 18 февраля 2020

Используйте boolean indexing и фильтруйте по DataFrame.isin только выбранные столбцы в списке и проверяйте оба значения True с по строкам по DataFrame.all :

df1 = df[df[['Start','End']].isin(start_end_list).all(axis=1)]

Другая идея заключается в тестировании обоих столбцов отдельно по Series.isin и цепных масок по & для побитового AND:

df1 = df[df['Start'].isin(start_end_list) & df['End'].isin(start_end_list)]

print (df1)
  Start End  Distance
0     A   B        10
1     A   C        11
3     B   C        13

Detail1 :

print (df[['Start','End']].isin(start_end_list))
   Start    End
0   True   True
1   True   True
2   True  False
3   True   True
4   True  False
5   True  False

print (df[['Start','End']].isin(start_end_list).all(axis=1))
0     True
1     True
2    False
3     True
4    False
5    False
dtype: bool

Detail2:

print (df['Start'].isin(start_end_list))
0    True
1    True
2    True
3    True
4    True
5    True
Name: Start, dtype: bool

print (df['End'].isin(start_end_list))
0     True
1     True
2    False
3     True
4    False
5    False
Name: End, dtype: bool

print (df['Start'].isin(start_end_list) & df['End'].isin(start_end_list))
0     True
1     True
2    False
3     True
4    False
5    False
dtype: bool

РЕДАКТИРОВАТЬ: Для повторяющихся строк добавить concat с DataFrame.sort_index только стабильным al go mergesort и последним индексом создания по умолчанию на DataFrame.reset_index с drop=True

df2 = pd.concat([df1, df1]).sort_index(kind='mergesort').reset_index(drop=True)
print (df2)
  Start End  Distance
0     A   B        10
1     A   B        10
2     A   C        11
3     A   C        11
4     B   C        13
5     B   C        13
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...