Строковая конкатенация Pandas значений строк столбца с неявной иерархией

#python #pandas #dataframe #row #string-concatenation

#python #pandas #фрейм данных #строка #строка-конкатенация

Вопрос:

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

Мне нужно сгенерировать еще один столбец в том же фрейме данных, который объединяет строковые значения штата и города, которые видны в «Col5», как показано на рисунке ниже.

output_dataframe

Я знаю о слиянии значений на основе столбцов. Но может ли что-то подобное быть достигнуто с помощью pandas или udf в python. Запросите ваши идеи.

Ответ №1:

  1. Создайте новый столбец с нулевыми значениями, заполните новый столбец именем состояния, если строка содержит «/» (или любой другой символ, который вы используете в своем формате даты).
  2. Затем вперед заполните новый столбец именами штатов, а затем заполните новый столбец названиями городов из Col 1.
  3. Наконец, исправьте строки, содержащие имя состояния, включив имя состояния только один раз.

Итак, что-то вроде этого:

 import pandas as pd
import numpy as np

df["Col 5"] = np.nan
df.loc[df['Col 2'].str.contains("/").fillna(False), "Col 5"] = df["Col 1"]
df["Col 5"] = df["Col 5"].ffill()   "|"   df['Col 1']
df.loc[df["Col 5"].str.split("|").str[0] == df["Col 5"].str.split("|").str[1], "Col 5"] = df["Col 5"].str.split("|").str[0]
 

Это то, что вы имели в виду?

Ответ №2:

Если это то, что я думаю, это довольно легко сделать. Есть несколько возможных вариантов, о которых я знаю, используя pandas

Вариант 1

 df_data = pd.DataFrame(...) # your data here

df_data["Col5"] = df_data["State"]   df_data["City"]


# or

df_data = (
   pd.DataFrame(...)
   .assign(
     Col5=lambda df: df["State"]   df["City"]
   )
)
 

Вариант 2 — использование apply

плюсы — легко сделать

минусы — относительно медленно (но если ваш набор данных невелик, я бы сильно попотел)

 df_data = pd.DataFrame(...) # your data here

df_data["Col5"] = df_data.apply(
  lambda row: row["Col1"]   row["Col2"] 
  axis=1
)