Python Pandas для сопоставления строк с перекрывающимися координатами - PullRequest
1 голос
/ 08 апреля 2020

Я python новичок ie, пытаюсь выяснить проблему с помощью pandas.

У меня есть два файла .csv, которые я импортировал как pandas фреймы данных.

один из этих файлов - это файл со строками для идентификационного номера, начальных и конечных координат:

ID  Start  End
1   45     99
3   27     29
6   13     23
19  11     44

у моего второго файла есть столбцы для кода, а также начальные и конечные координаты:

Code  Start  End
ss13d  67    100
dfv45  55    100
aal33  101   222
mm0ww  24    28

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

ID  Start  End  Code  Start  End
1   45     99   ss13d 67     100
1   45     99   dfv45 55     100
3   27     29   mm0ww 24     28

Я пытался использовать pandas .merge (), но из того, что я понимаю, списки должны иметь общие столбцы. В данном случае это мои начальные столбцы, но я не могу объединить эти столбцы, поскольку они сравниваются.

Пока что я наконец-то понял, логика c за тем, как я буду определять совпадения:

df = pd.read_csv (r'file1.csv')   
df2 = pd.read_csv ('file2.csv')

c= (df['Start'] <= df2['Start']) & (df['End'] >= df2['Start']) | (df['Start'] <= df2['End']) & (df['End'] >= df2['End'])

, но мне не повезло заставить что-либо работать.

Может ли кто-нибудь указать мне правильное направление? Мне кажется, что ни concat, ни merge не работают в этой ситуации.

1 Ответ

0 голосов
/ 08 апреля 2020

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

df1 = df1.rename(columns={'Start': 'Start_1', 'End': 'End_1'}) 
df2 = df2.rename(columns={'Start': 'Start_2', 'End': 'End_2'}) 

Далее, если вы хотите Чтобы объединить два кадра данных, но не иметь общего столбца, вы можете просто создать один:

df1["key"] = 0
df2["key"] = 0

Затем вы можете объединить этот столбец и снова отбросить его

joined_df = pd.merge(df1, df2).drop(columns=['key'])

Наконец, вы можете отфильтровать столбцы по перекрытию, например, так:

joined_df[(joined_df["Start_2"] > joined_df["Start_1"]) & (joined_df["Start_2"] < joined_df["End_1"])]

(Просто совет, используйте & и | в качестве бинарных операторов для объединения фильтров и всегда ставьте круглые скобки вокруг ваших bools .)

Надеюсь, это поможет и удачи с pandas!

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