Создать новый столбец df с входными данными из столбца 1 на основе условия из столбца 2 - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть DF с 50-ю столбцами и дубликатами ID. Интересующий меня раздел выглядит следующим образом

   ID      Value         year
0   3       200          1995   
1   3       100          2001
2   4       300          1995
3   4       250          2000

Все первые записи каждого ID = 1995, однако вторые записи соответствуют столбцу ValuedFrom (вторая запись - это возраст выхода на пенсию каждого объекта и, следовательно, его последнее значение в большинстве случаев). Я хотел бы объединить все три столбца, чтобы в итоге получилось два, например:

     ID  Value1995   ValueRetired
0   3       200           100   
1   4       300           250

Есть идеи, как мне это сделать?

Ответы [ 2 ]

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

Вы можете создать серию сопоставления year с метками, затем использовать pd.DataFrame.pivot:

df['YearType'] = np.where(df['year'] == 1995, 'Value1995', 'ValueRetired')

res = df.pivot(index='ID', columns='YearType', values='Value')

print(res)

YearType  Value1995  ValueRetired
ID                               
3               200           100
4               300           250
5               150            95
0 голосов
/ 07 ноября 2018

Общее решение:

print (df)
   ID  year  Value
1   3  2003     95
2   3  1995    200
2   3  2001    100
3   4  1995    300
4   4  2000    250
5   4  2004    150
6   5  2000    201
7   5  1995    202 <- remove this row with 1995, because last value of group 5, if seelct next row it is in another group
8   6  2000    203
9   6  2000    204

Сначала выберите индексы 1995 и все следующие строки:

idx = df.index[(df['year'] == 1995) & (df.groupby('ID').cumcount(ascending=False) != 0)]
idx2 = df.index.intersection(idx + 1).union(idx)
df = df.loc[idx2]
print (df)
   ID  year  Value  ValuedFrom
2   3  1995    200        1995
2   3  2001    100        2001
3   4  1995    300        1995
4   4  2000    250        2000

Деталь

print (df.groupby('ID').cumcount(ascending=False))
1    2
2    1
2    0
3    2
4    1
5    0
6    1
7    0
8    1
9    0
dtype: int64

Затем измените значения столбца year для изменения на unstack:

df['year'] = np.where(df['year'] == 1995, 'Value1995', 'ValueRetired')

df = df.set_index(['ID', 'year'])['Value'].unstack().reset_index().rename_axis(None, axis=1)
print (df)
   ID  Value1995  ValueRetired
0   3        200           100
1   4        300           250
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...