Как определить функцию if-else, используя столбцы данных в качестве аргументов в python? - PullRequest
0 голосов
/ 02 октября 2019

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

        period       id   column1
0    2013-01-31      5   NaT
1    2013-02-28      5   28 days
2    2013-03-31      5   31 days
3    2013-04-30      5   30 days
4    2016-05-31      6   NaT
5    2016-06-30      6   30 days
6    2016-08-31      6   62 days

Новые значения столбца должны быть определены в соответствии со значениями в column1:

, если column1 = NaT илиcolumn1> 31, затем новый столбец соответствует значению в столбце периода

Иначе - значения нового столбца должны быть скопированы из его предыдущей строки: новый столбец i-я строка = новый столбец i-1 строка.

Я очень плохо знаком с Python, и мой код не работает:

def f(x):
    if not x or x > 31
    return x=df['period']
    else
    return x=x.shift()
df['newcolumn'] = df['column1'].apply(f)

Вывод должен быть таким:

        period       id   column1  newcolumn
0    2013-01-31      5   NaT       2013-01-31 
1    2013-02-28      5   28 days   2013-01-31 
2    2013-03-31      5   31 days   2013-01-31 
3    2013-04-30      5   30 days   2013-01-31 
4    2016-05-31      6   NaT       2016-05-31
5    2016-06-30      6   30 days   2016-05-31
6    2016-08-31      6   62 days   2016-08-31

Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

сначала может потребоваться преобразовать период в дату и время: используя pd.to_datetime

df['period']=pd.to_datetime(df['period'])

Затем вы можете использовать Dataframe.where с DataFrame.ffill :

df['newcolumn']=df['period'].where((df["column1"]>pd.Timedelta("31 days"))|(df["column1"].isnull())).ffill()
print(df)



      period  id  column1 newcolumn
0 2013-01-31   5     NaT  2013-01-31
1 2013-02-28   5 28 days  2013-01-31
2 2013-03-31   5 31 days  2013-01-31
3 2013-04-30   5 30 days  2013-01-31
4 2016-05-31   6     NaT  2016-05-31
5 2016-06-30   6 30 days  2016-05-31
6 2016-08-31   6 62 days  2016-08-31
0 голосов
/ 02 октября 2019

вы можете использовать df.where(cond, other), который возвращает строку возврата df, если условие соответствует, иначе возвращает другое

df["newcolumn"] = df["period"].where(df["column1"].isnull() | (df["column1"]>pd.TimeDelta("31D")), df["column1"].shift())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...