Создайте новый столбец, если значение строки одного фрейма данных находится в столбце другого фрейма данных, и получите этот индекс - PullRequest
0 голосов
/ 07 сентября 2018

Возможно, я слишком усложняю эту проблему, но, похоже, не могу найти простое решение.

У меня есть два DataFrame. Давайте назовем их df1 и df2. Чтобы все было просто. Допустим, в df1 есть один столбец с именем «Некоторые данные», а в df2 есть два столбца, которые называются «некоторые данные» и «другие данные».

Пример:

df1

Some Data "Lebron James 123" "Lebron James 234"

df2

some data                        other data
"Lebron James 123 + other text"  "I want this in df1["New?"]"
"Michael Jordan"                 "Doesn't Matter"

Так что в основном я хочу создать новый столбец в df1 с именем «New?». В этом новом столбце (в df1) будет указано «Новое», если df1 [«Некоторые данные»] находится в df2 [«Некоторые другие данные»]. Однако, если в df2 ["некоторые данные"] нет экземпляра, я устанавливаю df1 ["New?"] Значение этой конкретной строки в df2 ["другие данные"].

Желаемый результат после запуска:

df1

Some Data                         New?
"Lebron James 123"  "I want this in df1["New?"]"
"Lebron James 234"               "New"

Так как вы можете видеть Новое? столбец будет включать значение этой конкретной строки из другого столбца данных. Леброна Джеймса 234 нет нигде в некоторых данных в df2, поэтому он говорит, что новый.

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

Спасибо

EDIT:

Из того, что я знаю, будет работать

df["New?"] = df1["Some Data"].isin(df2["some data"])

сделает

df1 [ "New?"]

True
False

Итак, я хочу, чтобы True был "Я хочу это в df1 [" New? "]", А False был New

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Судя по вашей информации, вам нужно просто np.where (если dfs имеют одинаковую длину)

df1['New?'] = np.where(df1["Some Data"].isin(df2["some data"]), df2['other data'], 'New')

    Some Data                       New?
0   Lebron James 123 + other text   I want this in df1[New?"]"
1   Lebron James 234                New

Для разной длины,

mask = df2["some data"].isin(df["Some Data"]).values
df.loc[mask,'New'] = df2.loc[mask, 'other data']

df.fillna('New')

Объяснение

По сути, у вас есть маска, и вы используете одну и ту же маску для фильтрации обоих фреймов данных. Это дает одинаковое количество результатов для обоих dfs с учетом описаний, и вы присваиваете значения «других данных» отфильтрованных строк из df2 одинаковым совпадающим строкам в df «некоторые данные»

0 голосов
/ 07 сентября 2018

Сначала создайте регулярное выражение, присоединившись к вашей серии df1:

rgx = '|'.join(df1['some data'])

Теперь используется np.where:

df1.assign(data=np.where(df2['some data'].str.match(rgx), df2['other data'], 'New'))

          some data                        data
0  Lebron James 123  I want this in df1["New?"]
1  Lebron James 234                         New

Пример с несоответствующими формами:

df1 = pd.DataFrame({'a': ['a', 'b', 'c', 'd']})
df2 = pd.DataFrame({'a': ['aaaaa', 'bbbb', 'ffff', 'gggg', 'hhhh']})

rgx = '({})'.format('|'.join(df1.a))
m = df2.assign(flag=df2.a.str.extract(rgx))

df1.set_index('a').join(m.set_index('flag')).fillna('New').reset_index()

  index      a
0     a  aaaaa
1     b   bbbb
2     c    New
3     d    New
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...