Python 3.x - присвоение значения условному логическому полю Pandas - другое поле - PullRequest
0 голосов
/ 27 июня 2018

Я работаю над условным присвоением в фрейме данных Pandas с тремя столбцами даты, из которых базовая дата будет получена с использованием четвертого категориального значения («таблица»).

Приведенный ниже код запускается, НО я получаю текст pd_date или nd_date (т.е. текст имени поля), а не значение даты из поля. Оба поля даты являются полями datetime, а BaseDate не определено ранее.

df.loc[df['table'].isin(['t1','t2']), ['BaseDate'] = df['pd_date']]

df.loc[df['table'].isin(['t3','t4']), ['BaseDate'] = df['nd_date']]

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

Я знаю, что это должно быть что-то простое, но я не могу решить это. Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

pd.DataFrame.loc принимает скалярные метки и может использоваться для настройки данных:

df = pd.DataFrame([['t1', 123, 456], ['t3', 789, 876]],
                  columns=['table', 'pd_date', 'nd_date'])

df.loc[df['table'].isin(['t1','t2']), 'BaseDate'] = df['pd_date']
df.loc[df['table'].isin(['t3','t4']), 'BaseDate'] = df['nd_date']

print(df)

  table  pd_date  nd_date  BaseDate
0    t1      123      456     123.0
1    t3      789      876     876.0

Вы можете найти его чище для использования numpy.where:

df['BaseDate'] = np.where(df['table'].isin(['t1','t2']), df['pd_date'], df['nd_date'])
0 голосов
/ 27 июня 2018

Похоже, все, что вы пытаетесь сделать, это переименовать столбец. Я бы попробовал это так.

tableOne = df.loc[df['table'].isin(['t1','t2'])]

tableOne.rename(index=str, columns={"pd_date": "BaseDate")

tableTwo = df.loc[df['table'].isin(['t1','t2'])]

tableTwo.rename(index=str, columns={"nd_date": "BaseDate")

df = pd.concat([tableOne,tableTwo])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...