У меня есть кадр данных, в котором я хотел бы выбрать определенные строки, преобразовать и объединить в Python.

Данные

id type stat    country
1  aa1  y       ca
2  bb2  n       ny
3  cc3  y       tx

Желательно

Use Input("select type value:  ")

type in:  aa1, bb2

*selects appropriate rows

 id    type stat    country 
 1     aa1  y       ca  
 2     bb2  n       ny  

Запустите какое-то преобразование - измените

df2 = df["country"].replace({"ca": "tx"}, inplace=True)

Объединить подмножество вновь преобразованных строк с оставшимся набором данных

 id    type stat    country 
 1     aa1  y       tx  
 2     bb2  n       ny
 3     cc3  y       tx  

Выполняется

Член SO предложил эту часть, которая хорошо работает, я пытаюсь собрать воедино оставшиеся строки с преобразованным подмножеством.

  out = input("select type value:  ")
  vals = [v.strip() for v in out.split(',')]
  df1 = df.query('type.isin(@vals)')

Любое предложение приветствуется.

0
Lynn 19 Янв 2022 в 18:35

3 ответа

Лучший ответ

Это должно работать:

out = input("select type value:  ")
vals = [v.strip() for v in out.split(',')]

# Find rows where criteria match
query_mask = df["type"].isin(vals)

# Do transformation only for those rows
df[query_mask] = df.loc[query_mask].replace({"ca": "tx"})

Если вы действительно хотите, чтобы оставшиеся данные находились в конце df:

out = input("select type value:  ")
vals = [v.strip() for v in out.split(',')]

# Find rows where criteria match
query_mask = df["type"].isin(vals)

# Grab rows where criteria match
query_rows = df.loc[query_mask]

# Grab leftover rows
leftover_rows = df.loc[~query_mask]

# Do transformations
query_rows.replace({"ca": "tx"}, inplace=True)

# Concatenate transformed rows and leftovers
df = pd.concat([query_rows, leftover_rows])
1
Jan Jaap Meijerink 19 Янв 2022 в 18:55
Привет, я больше хочу захватить оставшийся вывод в строке 3, чтобы я мог просто объединить это с df2
 – 
Lynn
19 Янв 2022 в 18:52
1
Просто добавьте оставшиеся данные (извлеченные с помощью ~query_mask): например, добавьте .append(df.loc[~query_mask, :]) к последней строке кода.
 – 
H. Rev.
19 Янв 2022 в 18:53
1
Обновлен мой ответ для подхода конкатенации
 – 
Jan Jaap Meijerink
19 Янв 2022 в 18:55

Давайте попробуем pandasql + update

import pandasql as ps

type = 'aa1','bb1'
q1 = """SELECT * FROM df where type in ('%s','%s') """ %(type)
df.update(ps.sqldf(q1, locals()).replace({"ca": "tx"}))
df
Out[257]: 
    id type stat country
0  1.0  aa1    y      tx
1  2.0  bb2    n      ny
2  3.0  cc3    y      tx
1
BENY 19 Янв 2022 в 18:55

Вы можете использовать mask и combine_first:

df = df.mask(~df['id'].isin(vals)).replace({'country': {'ca': 'tx'}}) \
       .combine_first(df)
print(df)

# Output
    id type stat country
1  aa1         y      tx
2  bb2         n      ny
3  cc3         y      tx
1
Corralien 19 Янв 2022 в 18:56
Спасибо @corralien - действительно интересно, как захватить этот первый набор данных - row3 - как мне зафиксировать это в переменной (оставшийся набор данных после запроса подмножества) - о, возможно, w comb_first
 – 
Lynn
19 Янв 2022 в 19:08
mask замените значения строк, которые вам не нужны, на nan, затем вы можете применить свое преобразование к другим выбранным вами строкам, а затем combine_first восстановить замаскированные значения.
 – 
Corralien
19 Янв 2022 в 20:20